[gccrs COMMIT 04/17] gccrs: Add explicitly filtering for is bound satisified

gerris.rs@gmail.com gerris.rs@gmail.com
Sun Aug 30 21:46:00 GMT 2026


From: Philip Herron <herron.philip@googlemail.com>

gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-bounds.h: optional trait arg
	* typecheck/rust-tyty-bounds.cc (TypeBoundsProbe::TypeBoundsProbe): likewise
	(TypeBoundsProbe::Probe): likewise
	(TypeBoundsProbe::is_bound_satisfied_for_type): use specified trait
	(TypeBoundsProbe::scan): try to scan for indexed traits

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: https://github.com/Rust-GCC/gccrs/commit/17eec6b39b01e7bd4c272796889c79c4bd751686

The commit has NOT been mentioned in any issue.

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4816

 gcc/rust/typecheck/rust-hir-type-bounds.h |  5 +++--
 gcc/rust/typecheck/rust-tyty-bounds.cc    | 25 +++++++++++++++--------
 2 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/gcc/rust/typecheck/rust-hir-type-bounds.h b/gcc/rust/typecheck/rust-hir-type-bounds.h
index bede69406..3dbc47ec7 100644
--- a/gcc/rust/typecheck/rust-hir-type-bounds.h
+++ b/gcc/rust/typecheck/rust-hir-type-bounds.h
@@ -30,7 +30,7 @@ class TypeBoundsProbe : public TypeCheckBase
 {
 public:
   static std::vector<std::pair<TraitReference *, HIR::ImplBlock *>>
-  Probe (TyTy::BaseType *receiver);
+  Probe (TyTy::BaseType *receiver, const HIR::Trait *specified_trait = nullptr);
 
   static bool is_bound_satisfied_for_type (TyTy::BaseType *receiver,
 					   TraitReference *ref);
@@ -46,9 +46,10 @@ private:
   void assemble_builtin_candidate (LangItem::Kind item);
 
 private:
-  TypeBoundsProbe (TyTy::BaseType *receiver);
+  TypeBoundsProbe (TyTy::BaseType *receiver, const HIR::Trait *specified_trait);
 
   TyTy::BaseType *receiver;
+  const HIR::Trait *specified_trait;
   std::vector<std::pair<TraitReference *, HIR::ImplBlock *>> trait_references;
 };
 
diff --git a/gcc/rust/typecheck/rust-tyty-bounds.cc b/gcc/rust/typecheck/rust-tyty-bounds.cc
index 21a55ac6c..86aa06d27 100644
--- a/gcc/rust/typecheck/rust-tyty-bounds.cc
+++ b/gcc/rust/typecheck/rust-tyty-bounds.cc
@@ -26,14 +26,16 @@
 namespace Rust {
 namespace Resolver {
 
-TypeBoundsProbe::TypeBoundsProbe (TyTy::BaseType *receiver)
-  : TypeCheckBase (), receiver (receiver)
+TypeBoundsProbe::TypeBoundsProbe (TyTy::BaseType *receiver,
+				  const HIR::Trait *specified_trait)
+  : TypeCheckBase (), receiver (receiver), specified_trait (specified_trait)
 {}
 
 std::vector<std::pair<TraitReference *, HIR::ImplBlock *>>
-TypeBoundsProbe::Probe (TyTy::BaseType *receiver)
+TypeBoundsProbe::Probe (TyTy::BaseType *receiver,
+			const HIR::Trait *specified_trait)
 {
-  TypeBoundsProbe probe (receiver);
+  TypeBoundsProbe probe (receiver, specified_trait);
   probe.scan ();
   return probe.trait_references;
 }
@@ -50,7 +52,7 @@ TypeBoundsProbe::is_bound_satisfied_for_type (TyTy::BaseType *receiver,
     }
 
   std::vector<std::pair<TraitReference *, HIR::ImplBlock *>> bounds
-    = Probe (receiver);
+    = Probe (receiver, ref->get_hir_trait_ref ());
   for (auto &bound : bounds)
     {
       const TraitReference *b = bound.first;
@@ -95,10 +97,15 @@ TypeBoundsProbe::scan ()
 {
   std::vector<std::pair<HIR::TypePath *, HIR::ImplBlock *>>
     possible_trait_paths;
-  mappings.iterate_impl_blocks (
-    [&] (HirId id, HIR::ImplBlock *impl) mutable -> bool {
-      return process_impl_block (id, impl, possible_trait_paths);
-    });
+  auto process_impl = [&] (HirId id, HIR::ImplBlock *impl) mutable -> bool {
+    return process_impl_block (id, impl, possible_trait_paths);
+  };
+
+  if (specified_trait == nullptr)
+    mappings.iterate_impl_blocks (process_impl);
+  else
+    mappings.iterate_trait_impl_blocks (
+      specified_trait->get_mappings ().get_nodeid (), process_impl);
 
   for (auto &path : possible_trait_paths)
     {
-- 
2.55.0



More information about the Gcc-rust mailing list