[gccrs COMMIT 11/17] gccrs: refactor out pathprobeimpltrait into its own class

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


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

gcc/rust/ChangeLog:

	* Make-lang.in: new object
	* backend/rust-compile-base.cc: refactor
	* backend/rust-compile-drop.cc: likewise
	* backend/rust-compile-resolve-path.cc: likewise
	* typecheck/rust-hir-path-probe.cc (PathProbeImplTrait::PathProbeImplTrait): likewise
	(PathProbeImplTrait::Probe): likewise
	(PathProbeImplTrait::process_trait_impl_items_for_candidates): likewise
	* typecheck/rust-hir-path-probe.h (class PathProbeImplTrait): likewise
	* typecheck/rust-hir-path-probe-impl-trait.cc: New file.
	* typecheck/rust-hir-path-probe-impl-trait.h: New file.

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/1d63d88e9282cfa4095acef221968d84c364bacf

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/Make-lang.in                         |   1 +
 gcc/rust/backend/rust-compile-base.cc         |   2 +-
 gcc/rust/backend/rust-compile-drop.cc         |   2 +-
 gcc/rust/backend/rust-compile-resolve-path.cc |   2 +-
 .../rust-hir-path-probe-impl-trait.cc         | 121 ++++++++++++++++++
 .../rust-hir-path-probe-impl-trait.h          |  58 +++++++++
 gcc/rust/typecheck/rust-hir-path-probe.cc     |  33 -----
 gcc/rust/typecheck/rust-hir-path-probe.h      |  17 ---
 8 files changed, 183 insertions(+), 53 deletions(-)
 create mode 100644 gcc/rust/typecheck/rust-hir-path-probe-impl-trait.cc
 create mode 100644 gcc/rust/typecheck/rust-hir-path-probe-impl-trait.h

diff --git a/gcc/rust/Make-lang.in b/gcc/rust/Make-lang.in
index 3f79477b7..91caebbee 100644
--- a/gcc/rust/Make-lang.in
+++ b/gcc/rust/Make-lang.in
@@ -187,6 +187,7 @@ GRS_OBJS = \
     rust/rust-polonius.o\
     rust/rust-hir-dot-operator.o \
     rust/rust-hir-path-probe.o \
+    rust/rust-hir-path-probe-impl-trait.o \
     rust/rust-hir-path-probe-type.o \
     rust/rust-hir-path.o \
     rust/rust-hir-type.o \
diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc
index 3c7cb71d2..d4161a96f 100644
--- a/gcc/rust/backend/rust-compile-base.cc
+++ b/gcc/rust/backend/rust-compile-base.cc
@@ -30,7 +30,7 @@
 #include "rust-expr.h" // for AST::AttrInputLiteral
 #include "rust-hir-map.h"
 #include "rust-macro.h" // for AST::MetaNameValueStr
-#include "rust-hir-path-probe.h"
+#include "rust-hir-path-probe-impl-trait.h"
 #include "rust-type-util.h"
 #include "rust-compile-implitem.h"
 #include "rust-attribute-values.h"
diff --git a/gcc/rust/backend/rust-compile-drop.cc b/gcc/rust/backend/rust-compile-drop.cc
index d6bf79c07..ca4e63f88 100644
--- a/gcc/rust/backend/rust-compile-drop.cc
+++ b/gcc/rust/backend/rust-compile-drop.cc
@@ -22,7 +22,7 @@
 #include "rust-compile-context.h"
 #include "rust-compile-implitem.h"
 #include "rust-bir-drop-analysis.h"
-#include "rust-hir-path-probe.h"
+#include "rust-hir-path-probe-impl-trait.h"
 #include "rust-hir-trait-reference.h"
 #include "rust-hir-type-bounds.h"
 #include "rust-lang-item.h"
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc b/gcc/rust/backend/rust-compile-resolve-path.cc
index d9225718b..db984bee3 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.cc
+++ b/gcc/rust/backend/rust-compile-resolve-path.cc
@@ -24,7 +24,7 @@
 #include "rust-compile-expr.h"
 #include "rust-hir-map.h"
 #include "rust-hir-trait-resolve.h"
-#include "rust-hir-path-probe.h"
+#include "rust-hir-path-probe-impl-trait.h"
 #include "rust-compile-extern.h"
 #include "rust-constexpr.h"
 #include "rust-rib.h"
diff --git a/gcc/rust/typecheck/rust-hir-path-probe-impl-trait.cc b/gcc/rust/typecheck/rust-hir-path-probe-impl-trait.cc
new file mode 100644
index 000000000..7b6871fb6
--- /dev/null
+++ b/gcc/rust/typecheck/rust-hir-path-probe-impl-trait.cc
@@ -0,0 +1,121 @@
+// Copyright (C) 2026 Free Software Foundation, Inc.
+
+// This file is part of GCC.
+
+// GCC is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3, or (at your option) any later
+// version.
+
+// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with GCC; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include "rust-hir-path-probe-impl-trait.h"
+#include "rust-hir-item.h"
+#include "rust-type-util.h"
+
+namespace Rust {
+namespace Resolver {
+
+PathProbeImplTrait::PathProbeImplTrait (TyTy::BaseType *receiver,
+					const HIR::PathIdentSegment &query,
+					const TraitReference *trait_reference)
+  : TypeCheckBase (), mappings (Analysis::Mappings::get ()),
+    receiver (receiver), search (query), trait_reference (trait_reference),
+    current_impl (nullptr)
+{}
+
+std::set<PathProbeCandidate>
+PathProbeImplTrait::Probe (TyTy::BaseType *receiver,
+			   const HIR::PathIdentSegment &segment_name,
+			   const TraitReference *trait_reference)
+{
+  PathProbeImplTrait probe (receiver, segment_name, trait_reference);
+  probe.process_trait_impl_items_for_candidates ();
+  return probe.candidates;
+}
+
+void
+PathProbeImplTrait::process_trait_impl_items_for_candidates ()
+{
+  NodeId trait_node_id = trait_reference->get_mappings ().get_nodeid ();
+  mappings.iterate_trait_impl_items (trait_node_id,
+				     [this] (HirId id, HIR::ImplItem *item,
+					     HIR::ImplBlock *impl) -> bool {
+				       process_impl_item_candidate (id, item,
+								    impl);
+				       return true;
+				     });
+}
+
+void
+PathProbeImplTrait::process_impl_item_candidate (HirId id, HIR::ImplItem *item,
+						 HIR::ImplBlock *impl)
+{
+  current_impl = impl;
+  HirId impl_ty_id = impl->get_type ().get_mappings ().get_hirid ();
+  TyTy::BaseType *impl_block_ty = nullptr;
+  if (!query_type (impl_ty_id, &impl_block_ty))
+    return;
+
+  if (!types_compatable (TyTy::TyWithLocation (receiver),
+			 TyTy::TyWithLocation (impl_block_ty),
+			 impl->get_locus (), false))
+    return;
+
+  item->accept_vis (*this);
+}
+
+void
+PathProbeImplTrait::visit (HIR::TypeAlias &alias)
+{
+  if (search.to_string () != alias.get_new_type_name ().as_string ())
+    return;
+
+  TyTy::BaseType *ty = nullptr;
+  if (!query_type (alias.get_mappings ().get_hirid (), &ty))
+    return;
+
+  PathProbeCandidate::ImplItemCandidate item{&alias, current_impl};
+  candidates.insert (
+    {PathProbeCandidate::IMPL_TYPE_ALIAS, ty, alias.get_locus (), item});
+}
+
+void
+PathProbeImplTrait::visit (HIR::ConstantItem &constant)
+{
+  if (search.to_string () != constant.get_identifier ().as_string ())
+    return;
+
+  TyTy::BaseType *ty = nullptr;
+  if (!query_type (constant.get_mappings ().get_hirid (), &ty))
+    return;
+
+  PathProbeCandidate::ImplItemCandidate item{&constant, current_impl};
+  candidates.insert (
+    {PathProbeCandidate::IMPL_CONST, ty, constant.get_locus (), item});
+}
+
+void
+PathProbeImplTrait::visit (HIR::Function &function)
+{
+  if (search.to_string () != function.get_function_name ().as_string ())
+    return;
+
+  TyTy::BaseType *ty = nullptr;
+  if (!query_type (function.get_mappings ().get_hirid (), &ty))
+    return;
+
+  PathProbeCandidate::ImplItemCandidate item{&function, current_impl};
+  candidates.insert (
+    {PathProbeCandidate::IMPL_FUNC, ty, function.get_locus (), item});
+}
+
+} // namespace Resolver
+} // namespace Rust
diff --git a/gcc/rust/typecheck/rust-hir-path-probe-impl-trait.h b/gcc/rust/typecheck/rust-hir-path-probe-impl-trait.h
new file mode 100644
index 000000000..d61019748
--- /dev/null
+++ b/gcc/rust/typecheck/rust-hir-path-probe-impl-trait.h
@@ -0,0 +1,58 @@
+// Copyright (C) 2026 Free Software Foundation, Inc.
+
+// This file is part of GCC.
+
+// GCC is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3, or (at your option) any later
+// version.
+
+// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with GCC; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#ifndef RUST_HIR_PATH_PROBE_IMPL_TRAIT_H
+#define RUST_HIR_PATH_PROBE_IMPL_TRAIT_H
+
+#include "rust-hir-path-probe.h"
+
+namespace Rust {
+namespace Resolver {
+
+class PathProbeImplTrait : public TypeCheckBase, public HIR::HIRImplVisitor
+{
+public:
+  static std::set<PathProbeCandidate>
+  Probe (TyTy::BaseType *receiver, const HIR::PathIdentSegment &segment_name,
+	 const TraitReference *trait_reference);
+
+  void visit (HIR::TypeAlias &alias) override;
+  void visit (HIR::ConstantItem &constant) override;
+  void visit (HIR::Function &function) override;
+
+private:
+  PathProbeImplTrait (TyTy::BaseType *receiver,
+		      const HIR::PathIdentSegment &query,
+		      const TraitReference *trait_reference);
+
+  void process_trait_impl_items_for_candidates ();
+  void process_impl_item_candidate (HirId id, HIR::ImplItem *item,
+				    HIR::ImplBlock *impl);
+
+  Analysis::Mappings &mappings;
+  TyTy::BaseType *receiver;
+  const HIR::PathIdentSegment &search;
+  const TraitReference *trait_reference;
+  std::set<PathProbeCandidate> candidates;
+  HIR::ImplBlock *current_impl;
+};
+
+} // namespace Resolver
+} // namespace Rust
+
+#endif // RUST_HIR_PATH_PROBE_IMPL_TRAIT_H
diff --git a/gcc/rust/typecheck/rust-hir-path-probe.cc b/gcc/rust/typecheck/rust-hir-path-probe.cc
index a6c378f25..2a6f93797 100644
--- a/gcc/rust/typecheck/rust-hir-path-probe.cc
+++ b/gcc/rust/typecheck/rust-hir-path-probe.cc
@@ -472,38 +472,5 @@ PathProbeType::is_receiver_generic () const
   return receiver_is_type_param || receiver_is_dyn;
 }
 
-// PathProbImplTrait
-
-PathProbeImplTrait::PathProbeImplTrait (TyTy::BaseType *receiver,
-					const HIR::PathIdentSegment &query,
-					const TraitReference *trait_reference)
-  : PathProbeType (receiver, query, UNKNOWN_DEFID),
-    trait_reference (trait_reference)
-{}
-
-std::set<PathProbeCandidate>
-PathProbeImplTrait::Probe (TyTy::BaseType *receiver,
-			   const HIR::PathIdentSegment &segment_name,
-			   const TraitReference *trait_reference)
-{
-  PathProbeImplTrait probe (receiver, segment_name, trait_reference);
-  // iterate all impls for this trait and receiver
-  // then search for possible candidates using base class behaviours
-  probe.process_trait_impl_items_for_candidates ();
-  return probe.candidates;
-}
-
-void
-PathProbeImplTrait::process_trait_impl_items_for_candidates ()
-{
-  NodeId trait_node_id = trait_reference->get_mappings ().get_nodeid ();
-  mappings.iterate_trait_impl_items (
-    trait_node_id,
-    [&] (HirId id, HIR::ImplItem *item, HIR::ImplBlock *impl) mutable -> bool {
-      process_impl_item_candidate (id, item, impl);
-      return true;
-    });
-}
-
 } // namespace Resolver
 } // namespace Rust
diff --git a/gcc/rust/typecheck/rust-hir-path-probe.h b/gcc/rust/typecheck/rust-hir-path-probe.h
index ad83ddf95..d9800e1c6 100644
--- a/gcc/rust/typecheck/rust-hir-path-probe.h
+++ b/gcc/rust/typecheck/rust-hir-path-probe.h
@@ -173,23 +173,6 @@ public:
   }
 };
 
-class PathProbeImplTrait : public PathProbeType
-{
-public:
-  static std::set<PathProbeCandidate>
-  Probe (TyTy::BaseType *receiver, const HIR::PathIdentSegment &segment_name,
-	 const TraitReference *trait_reference);
-
-private:
-  PathProbeImplTrait (TyTy::BaseType *receiver,
-		      const HIR::PathIdentSegment &query,
-		      const TraitReference *trait_reference);
-
-  void process_trait_impl_items_for_candidates ();
-
-  const TraitReference *trait_reference;
-};
-
 } // namespace Resolver
 } // namespace Rust
 
-- 
2.55.0



More information about the Gcc-rust mailing list