diff options
author | Philip Herron <philip.herron@embecosm.com> | 2022-08-31 17:07:51 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2022-08-31 17:17:03 +0100 |
commit | 126c7c9d7a2f9023115d6c692dbcf9e981ba2b4a (patch) | |
tree | fbef73898370d35d0cbd5ceafa1aabaf1c11b068 /gcc | |
parent | 721c7a472c4cf5dc74337c997ff627187b577d60 (diff) | |
download | gcc-126c7c9d7a2f9023115d6c692dbcf9e981ba2b4a.zip gcc-126c7c9d7a2f9023115d6c692dbcf9e981ba2b4a.tar.gz gcc-126c7c9d7a2f9023115d6c692dbcf9e981ba2b4a.tar.bz2 |
Add new check for contains_associated_types
We don't need to setup associated types when a trait does not contain any
associated types.
Diffstat (limited to 'gcc')
-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 7357585..146fe26 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 7a1562a..811d64b 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 a351932..649f133 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; |