[gccrs COMMIT 17/17] gccrs: Seperate trait fn signiture resolution from body
gerris.rs@gmail.com
gerris.rs@gmail.com
Sun Aug 30 21:46:13 GMT 2026
From: Philip Herron <herron.philip@googlemail.com>
gcc/rust/ChangeLog:
* typecheck/rust-hir-trait-reference.cc (TraitItemReference::get_tyty): early guard
(TraitReference::resolve_default_function_bodies): new body resolver
* typecheck/rust-hir-trait-reference.h: new prototypes
* typecheck/rust-hir-trait-resolve.cc (TraitItemReference::on_resolved): resolve body
(TraitItemReference::resolve_default_function_body): likewise
(TraitItemReference::resolve_item): clearing pending
* typecheck/rust-hir-type-check-item.cc (TypeCheckItem::ResolveTraitSignature): new
(TypeCheckItem::resolve_trait): likewise
(TypeCheckItem::visit): likewise
* typecheck/rust-hir-type-check-item.h: likewise
* typecheck/rust-type-util.cc (query_type): get signiture
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/bb00634ab27d2510aca4e3319c4e5d6f89d4ae28
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
.../typecheck/rust-hir-trait-reference.cc | 12 +++++++++
gcc/rust/typecheck/rust-hir-trait-reference.h | 4 +++
gcc/rust/typecheck/rust-hir-trait-resolve.cc | 26 ++++++++++++++++++-
.../typecheck/rust-hir-type-check-item.cc | 20 ++++++++++++--
gcc/rust/typecheck/rust-hir-type-check-item.h | 4 +++
gcc/rust/typecheck/rust-type-util.cc | 6 +++++
6 files changed, 69 insertions(+), 3 deletions(-)
diff --git a/gcc/rust/typecheck/rust-hir-trait-reference.cc b/gcc/rust/typecheck/rust-hir-trait-reference.cc
index 1753988ea..9305defc0 100644
--- a/gcc/rust/typecheck/rust-hir-trait-reference.cc
+++ b/gcc/rust/typecheck/rust-hir-trait-reference.cc
@@ -75,6 +75,11 @@ TraitItemReference::get_tyty () const
{
rust_assert (hir_trait_item != nullptr);
+ TyTy::BaseType *resolved = nullptr;
+ if (type == FN
+ && context->lookup_type (get_mappings ().get_hirid (), &resolved))
+ return resolved;
+
switch (type)
{
case CONST:
@@ -355,6 +360,13 @@ TraitReference::on_resolved ()
}
}
+void
+TraitReference::resolve_default_function_bodies ()
+{
+ for (auto &item : item_refs)
+ item.resolve_default_function_body (this);
+}
+
bool
TraitReference::is_equal (const TraitReference &other) const
{
diff --git a/gcc/rust/typecheck/rust-hir-trait-reference.h b/gcc/rust/typecheck/rust-hir-trait-reference.h
index b26ba0ad5..b2c62904a 100644
--- a/gcc/rust/typecheck/rust-hir-trait-reference.h
+++ b/gcc/rust/typecheck/rust-hir-trait-reference.h
@@ -104,6 +104,8 @@ public:
// the trait will not be stored in its own map yet
void on_resolved (const TraitReference *tref);
+ void resolve_default_function_body (const TraitReference *tref);
+
bool is_object_safe () const;
private:
@@ -209,6 +211,8 @@ public:
void on_resolved ();
+ void resolve_default_function_bodies ();
+
bool is_equal (const TraitReference &other) const;
std::vector<TyTy::TypeBoundPredicate> get_super_traits () const;
diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
index be71f6fab..5be1989c5 100644
--- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc
+++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
@@ -437,7 +437,12 @@ TraitItemReference::on_resolved (const TraitReference *tref)
break;
case FN:
- resolve_item (tref, static_cast<HIR::TraitItemFunc &> (*hir_trait_item));
+ {
+ TyTy::BaseType *fn_type = get_tyty ();
+ if (is_optional () && fn_type->get_kind () == TyTy::TypeKind::FNDEF)
+ context->mark_function_body_pending (
+ static_cast<TyTy::FnType *> (fn_type)->get_id ());
+ }
break;
default:
@@ -445,6 +450,24 @@ TraitItemReference::on_resolved (const TraitReference *tref)
}
}
+void
+TraitItemReference::resolve_default_function_body (const TraitReference *tref)
+{
+ if (type != FN || !is_optional ())
+ return;
+
+ auto &func = static_cast<HIR::TraitItemFunc &> (*hir_trait_item);
+ TyTy::BaseType *item_tyty = get_tyty ();
+ if (item_tyty->get_kind () != TyTy::TypeKind::FNDEF)
+ return;
+
+ auto fn_type = static_cast<TyTy::FnType *> (item_tyty);
+ if (!context->function_body_pending (fn_type->get_id ()))
+ return;
+
+ resolve_item (tref, func);
+}
+
void
TraitItemReference::resolve_item (const TraitReference *tref,
HIR::TraitItemType &type)
@@ -537,6 +560,7 @@ TraitItemReference::resolve_item (const TraitReference *tref,
// need to get the return type from this
TyTy::FnType *resolved_fn_type = static_cast<TyTy::FnType *> (item_tyty);
+ context->clear_function_body_pending (resolved_fn_type->get_id ());
auto expected_ret_tyty = resolved_fn_type->get_return_type ();
context->push_return_type (TypeCheckContextItem (&func), expected_ret_tyty);
diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.cc b/gcc/rust/typecheck/rust-hir-type-check-item.cc
index ba4017adc..bff50778d 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-item.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-item.cc
@@ -121,6 +121,13 @@ TypeCheckItem::ResolveFunctionSignature (HIR::Function &function)
return result;
}
+TyTy::BaseType *
+TypeCheckItem::ResolveTraitSignature (HIR::Trait &trait)
+{
+ TypeCheckItem resolver;
+ return resolver.resolve_trait (trait, false);
+}
+
TyTy::BaseType *
TypeCheckItem::ResolveImplItem (HIR::ImplBlock &impl_block, HIR::ImplItem &item)
{
@@ -962,6 +969,12 @@ TypeCheckItem::visit (HIR::Module &module)
void
TypeCheckItem::visit (HIR::Trait &trait)
+{
+ infered = resolve_trait (trait, true);
+}
+
+TyTy::BaseType *
+TypeCheckItem::resolve_trait (HIR::Trait &trait, bool resolve_bodies)
{
auto lifetime_pin = context->push_clean_lifetime_resolver ();
@@ -987,11 +1000,14 @@ TypeCheckItem::visit (HIR::Trait &trait)
if (trait_ref->is_error ())
{
infered = new TyTy::ErrorType (trait.get_mappings ().get_hirid ());
- return;
+ return infered;
}
+ if (resolve_bodies)
+ trait_ref->resolve_default_function_bodies ();
+
RustIdent ident{CanonicalPath::create_empty (), trait.get_locus ()};
- infered = new TyTy::DynamicObjectType (
+ return new TyTy::DynamicObjectType (
trait.get_mappings ().get_hirid (), ident,
{TyTy::TypeBoundPredicate (*trait_ref, BoundPolarity::RegularBound,
trait.get_locus ())});
diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.h b/gcc/rust/typecheck/rust-hir-type-check-item.h
index 9b223f291..ed9a4fd0c 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-item.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-item.h
@@ -32,6 +32,8 @@ public:
static TyTy::FnType *ResolveFunctionSignature (HIR::Function &function);
+ static TyTy::BaseType *ResolveTraitSignature (HIR::Trait &trait);
+
static TyTy::BaseType *ResolveImplItem (HIR::ImplBlock &impl_block,
HIR::ImplItem &item);
@@ -92,6 +94,8 @@ protected:
TyTy::FnType *resolve_function_signature (HIR::Function &function);
+ TyTy::BaseType *resolve_trait (HIR::Trait &trait, bool resolve_bodies);
+
bool validate_repr_simd (const std::vector<TyTy::StructFieldType *> &fields,
location_t locus);
diff --git a/gcc/rust/typecheck/rust-type-util.cc b/gcc/rust/typecheck/rust-type-util.cc
index 1ba486626..21559cb2a 100644
--- a/gcc/rust/typecheck/rust-type-util.cc
+++ b/gcc/rust/typecheck/rust-type-util.cc
@@ -84,6 +84,12 @@ query_type (HirId reference, TyTy::BaseType **result)
HIR::Function &fn = *static_cast<HIR::Function *> (item.value ());
*result = TypeCheckItem::ResolveFunctionSignature (fn);
}
+ else if (item.value ()->get_item_kind () == HIR::Item::ItemKind::Trait
+ && is_local)
+ {
+ HIR::Trait &trait = *static_cast<HIR::Trait *> (item.value ());
+ *result = TypeCheckItem::ResolveTraitSignature (trait);
+ }
else
{
*result = TypeCheckItem::Resolve (*item.value ());
--
2.55.0
More information about the Gcc-rust
mailing list