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:
Philip Herron
2022-08-31 17:07:51 +01:00
committed by Arthur Cohen
parent 43cb42a3d8
commit e641158a5f
3 changed files with 20 additions and 0 deletions

View File

@@ -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 ();

View File

@@ -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 *

View File

@@ -1057,6 +1057,8 @@ public:
bool requires_generic_args () const;
bool contains_associated_types () const;
private:
DefId reference;
Location locus;