diff options
author | Philip Herron <philip.herron@embecosm.com> | 2022-08-31 17:07:51 +0100 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2023-01-31 14:16:50 +0100 |
commit | e641158a5f5cd80ee2ce32fded1179ce1b3e1193 (patch) | |
tree | ec676198a8556dd49251ffe3603b50135fcdcf0a | |
parent | 43cb42a3d82d1c29592a5232811fc608ef6cea49 (diff) | |
download | gcc-e641158a5f5cd80ee2ce32fded1179ce1b3e1193.zip gcc-e641158a5f5cd80ee2ce32fded1179ce1b3e1193.tar.gz gcc-e641158a5f5cd80ee2ce32fded1179ce1b3e1193.tar.bz2 |
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.
-rw-r--r-- | gcc/rust/typecheck/rust-hir-trait-resolve.cc | 3 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty-bounds.cc | 15 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty.h | 2 |
3 files changed, 20 insertions, 0 deletions
diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc b/gcc/rust/typecheck/rust-hir-trait-resolve.cc index c14a6c3..22398b1 100644 --- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc +++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc @@ -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 (); diff --git a/gcc/rust/typecheck/rust-tyty-bounds.cc b/gcc/rust/typecheck/rust-tyty-bounds.cc index 8dfd692..69376aa 100644 --- a/gcc/rust/typecheck/rust-tyty-bounds.cc +++ b/gcc/rust/typecheck/rust-tyty-bounds.cc @@ -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 * diff --git a/gcc/rust/typecheck/rust-tyty.h b/gcc/rust/typecheck/rust-tyty.h index 14868f2..24efc7a 100644 --- a/gcc/rust/typecheck/rust-tyty.h +++ b/gcc/rust/typecheck/rust-tyty.h @@ -1057,6 +1057,8 @@ public: bool requires_generic_args () const; + bool contains_associated_types () const; + private: DefId reference; Location locus; |