mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-22 20:01:22 -05:00
gccrs: Add new check for contains_associated_types
We don't need to setup associated types when a trait does not contain any associated types. gcc/rust/ChangeLog: * typecheck/rust-tyty-bounds.cc (TypeBoundPredicate::contains_associated_types): Check if a type bound predicate contains assocated types. * typecheck/rust-tyty.h: Declare the above mentioned function. * typecheck/rust-hir-trait-resolve.cc: Use `contains_associated_types` function.
This commit is contained in:
committed by
Arthur Cohen
parent
43cb42a3d8
commit
e641158a5f
@@ -368,6 +368,9 @@ void
|
||||
AssociatedImplTrait::setup_associated_types (
|
||||
const TyTy::BaseType *self, const TyTy::TypeBoundPredicate &bound)
|
||||
{
|
||||
if (!bound.contains_associated_types ())
|
||||
return;
|
||||
|
||||
// compute the constrained impl block generic arguments based on self and the
|
||||
// higher ranked trait bound
|
||||
TyTy::BaseType *receiver = self->clone ();
|
||||
|
||||
@@ -374,6 +374,21 @@ TypeBoundPredicate::requires_generic_args () const
|
||||
return substitutions.size () > 1;
|
||||
}
|
||||
|
||||
bool
|
||||
TypeBoundPredicate::contains_associated_types () const
|
||||
{
|
||||
auto trait_ref = get ();
|
||||
for (const auto &trait_item : trait_ref->get_trait_items ())
|
||||
{
|
||||
bool is_associated_type
|
||||
= trait_item.get_trait_item_type ()
|
||||
== Resolver::TraitItemReference::TraitItemType::TYPE;
|
||||
if (is_associated_type)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// trait item reference
|
||||
|
||||
const Resolver::TraitItemReference *
|
||||
|
||||
@@ -1057,6 +1057,8 @@ public:
|
||||
|
||||
bool requires_generic_args () const;
|
||||
|
||||
bool contains_associated_types () const;
|
||||
|
||||
private:
|
||||
DefId reference;
|
||||
Location locus;
|
||||
|
||||
Reference in New Issue
Block a user