[gccrs COMMIT 14/17] gccrs: minor select method improvement
gerris.rs@gmail.com
gerris.rs@gmail.com
Sun Aug 30 21:46:10 GMT 2026
From: Philip Herron <herron.philip@googlemail.com>
We can do a defid check and possibly early return for mismatches on adt's.
gcc/rust/ChangeLog:
* typecheck/rust-hir-dot-operator.cc:
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/8cc925fb593d5bb252374038296f39aed61d0d1d
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-dot-operator.cc | 162 ++++++++++++--------
1 file changed, 95 insertions(+), 67 deletions(-)
diff --git a/gcc/rust/typecheck/rust-hir-dot-operator.cc b/gcc/rust/typecheck/rust-hir-dot-operator.cc
index f74005e1e..227e5dce1 100644
--- a/gcc/rust/typecheck/rust-hir-dot-operator.cc
+++ b/gcc/rust/typecheck/rust-hir-dot-operator.cc
@@ -124,73 +124,86 @@ MethodResolver::assemble_inherent_impl_candidates (
bool receiver_is_ref = raw->get_kind () == TyTy::TypeKind::REF;
// Assemble inherent impl items (non-trait impl blocks)
- mappings.iterate_impl_items (
- [&] (HirId id, HIR::ImplItem *item, HIR::ImplBlock *impl) mutable -> bool {
- bool is_trait_impl = impl->has_trait_ref ();
- if (is_trait_impl)
- return true;
+ mappings.iterate_impl_items ([&] (HirId id, HIR::ImplItem *item,
+ HIR::ImplBlock *impl) mutable -> bool {
+ bool is_trait_impl = impl->has_trait_ref ();
+ if (is_trait_impl)
+ return true;
- bool is_fn
- = item->get_impl_item_type () == HIR::ImplItem::ImplItemType::FUNCTION;
- if (!is_fn)
- return true;
+ bool is_fn
+ = item->get_impl_item_type () == HIR::ImplItem::ImplItemType::FUNCTION;
+ if (!is_fn)
+ return true;
- HIR::Function *func = static_cast<HIR::Function *> (item);
- if (!func->is_method ())
- return true;
+ HIR::Function *func = static_cast<HIR::Function *> (item);
+ if (!func->is_method ())
+ return true;
- bool name_matches = func->get_function_name ().as_string ().compare (
- segment_name.to_string ())
- == 0;
- if (!name_matches)
- return true;
+ bool name_matches = func->get_function_name ().as_string ().compare (
+ segment_name.to_string ())
+ == 0;
+ if (!name_matches)
+ return true;
- TyTy::BaseType *ty = nullptr;
- if (!query_type (func->get_mappings ().get_hirid (), &ty))
- return true;
- if (ty == nullptr || ty->get_kind () == TyTy::TypeKind::ERROR)
- return true;
- if (ty->get_kind () != TyTy::TypeKind::FNDEF)
- return true;
+ TyTy::BaseType *impl_self = TypeCheckItem::ResolveImplBlockSelf (*impl);
- TyTy::FnType *fnty = static_cast<TyTy::FnType *> (ty);
- const TyTy::BaseType *impl_self
- = TypeCheckItem::ResolveImplBlockSelf (*impl);
+ if (impl_self == nullptr || impl_self->get_kind () == TyTy::TypeKind::ERROR)
+ return true;
- // see:
- // https://gcc-rust.zulipchat.com/#narrow/stream/266897-general/topic/Method.20Resolution/near/338646280
- // https://github.com/rust-lang/rust/blob/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/compiler/rustc_typeck/src/check/method/probe.rs#L650-L660
- bool impl_self_is_ptr = impl_self->get_kind () == TyTy::TypeKind::POINTER;
- bool impl_self_is_ref = impl_self->get_kind () == TyTy::TypeKind::REF;
- if (receiver_is_raw_ptr && impl_self_is_ptr)
- {
- const TyTy::PointerType &sptr
- = *static_cast<const TyTy::PointerType *> (impl_self);
- const TyTy::PointerType &ptr
- = *static_cast<const TyTy::PointerType *> (raw);
-
- // we could do this via lang-item assemblies if we refactor this
- bool mut_match = sptr.mutability () == ptr.mutability ();
- if (!mut_match)
- return true;
- }
- else if (receiver_is_ref && impl_self_is_ref)
- {
- const TyTy::ReferenceType &sptr
- = *static_cast<const TyTy::ReferenceType *> (impl_self);
- const TyTy::ReferenceType &ptr
- = *static_cast<const TyTy::ReferenceType *> (raw);
-
- // we could do this via lang-item assemblies if we refactor this
- bool mut_match = sptr.mutability () == ptr.mutability ();
- if (!mut_match)
- return true;
- }
+ if (receiver.get_kind () == TyTy::TypeKind::ADT
+ && impl_self->get_kind () == TyTy::TypeKind::ADT)
+ {
+ const auto &receiver_adt
+ = static_cast<const TyTy::ADTType &> (receiver);
+ const auto &impl_adt = static_cast<const TyTy::ADTType &> (*impl_self);
+ if (receiver_adt.get_id () != impl_adt.get_id ())
+ return true;
+ }
- inherent_impl_fns.emplace_back (func, impl, fnty);
+ // see:
+ // https://gcc-rust.zulipchat.com/#narrow/stream/266897-general/topic/Method.20Resolution/near/338646280
+ // https://github.com/rust-lang/rust/blob/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/compiler/rustc_typeck/src/check/method/probe.rs#L650-L660
+ bool impl_self_is_ptr = impl_self->get_kind () == TyTy::TypeKind::POINTER;
+ bool impl_self_is_ref = impl_self->get_kind () == TyTy::TypeKind::REF;
+ if (receiver_is_raw_ptr && impl_self_is_ptr)
+ {
+ const TyTy::PointerType &sptr
+ = *static_cast<const TyTy::PointerType *> (impl_self);
+ const TyTy::PointerType &ptr
+ = *static_cast<const TyTy::PointerType *> (raw);
+
+ // we could do this via lang-item assemblies if we refactor this
+ bool mut_match = sptr.mutability () == ptr.mutability ();
+ if (!mut_match)
+ return true;
+ }
+ else if (receiver_is_ref && impl_self_is_ref)
+ {
+ const TyTy::ReferenceType &sptr
+ = *static_cast<const TyTy::ReferenceType *> (impl_self);
+ const TyTy::ReferenceType &ptr
+ = *static_cast<const TyTy::ReferenceType *> (raw);
+
+ // we could do this via lang-item assemblies if we refactor this
+ bool mut_match = sptr.mutability () == ptr.mutability ();
+ if (!mut_match)
+ return true;
+ }
+ TyTy::BaseType *ty = nullptr;
+ if (!query_type (func->get_mappings ().get_hirid (), &ty))
+ return true;
+ if (ty == nullptr || ty->get_kind () == TyTy::TypeKind::ERROR)
+ return true;
+ if (ty->get_kind () != TyTy::TypeKind::FNDEF)
return true;
- });
+
+ TyTy::FnType *fnty = static_cast<TyTy::FnType *> (ty);
+
+ inherent_impl_fns.emplace_back (func, impl, fnty);
+
+ return true;
+ });
return inherent_impl_fns;
}
@@ -228,17 +241,22 @@ MethodResolver::assemble_trait_impl_candidates (
if (!name_matches)
continue;
- TyTy::BaseType *ty = nullptr;
- if (!query_type (func->get_mappings ().get_hirid (), &ty))
- continue;
- if (ty == nullptr || ty->get_kind () == TyTy::TypeKind::ERROR)
- continue;
- if (ty->get_kind () != TyTy::TypeKind::FNDEF)
+ TyTy::BaseType *impl_self = TypeCheckItem::ResolveImplBlockSelf (*impl);
+
+ if (impl_self == nullptr
+ || impl_self->get_kind () == TyTy::TypeKind::ERROR)
continue;
- TyTy::FnType *fnty = static_cast<TyTy::FnType *> (ty);
- const TyTy::BaseType *impl_self
- = TypeCheckItem::ResolveImplBlockSelf (*impl);
+ if (receiver.get_kind () == TyTy::TypeKind::ADT
+ && impl_self->get_kind () == TyTy::TypeKind::ADT)
+ {
+ const auto &receiver_adt
+ = static_cast<const TyTy::ADTType &> (receiver);
+ const auto &impl_adt
+ = static_cast<const TyTy::ADTType &> (*impl_self);
+ if (receiver_adt.get_id () != impl_adt.get_id ())
+ continue;
+ }
// see:
// https://gcc-rust.zulipchat.com/#narrow/stream/266897-general/topic/Method.20Resolution/near/338646280
@@ -271,6 +289,16 @@ MethodResolver::assemble_trait_impl_candidates (
continue;
}
+ TyTy::BaseType *ty = nullptr;
+ if (!query_type (func->get_mappings ().get_hirid (), &ty))
+ continue;
+ if (ty == nullptr || ty->get_kind () == TyTy::TypeKind::ERROR)
+ continue;
+ if (ty->get_kind () != TyTy::TypeKind::FNDEF)
+ continue;
+
+ TyTy::FnType *fnty = static_cast<TyTy::FnType *> (ty);
+
impl_candidates.emplace_back (func, impl, fnty);
return true;
}
--
2.55.0
More information about the Gcc-rust
mailing list