https://gcc.gnu.org/g:a348ac46239553e7ede82753faf05449279e1886
commit r17-4307-ga348ac46239553e7ede82753faf05449279e1886 Author: Philip Herron <[email protected]> Date: Fri Aug 28 23:42:09 2026 +0100 gccrs: Seperate trait fn signiture resolution from body 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 <[email protected]> Diff: --- gcc/rust/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 +++++++++++++++++++++++++- gcc/rust/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 1753988ea52f..9305defc0088 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 b26ba0ad547a..b2c62904a8e2 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 be71f6fabacb..5be1989c55a4 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 ba4017adc1a3..bff50778d86e 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 9b223f291ac8..ed9a4fd0cee8 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 1ba486626786..21559cb2a8df 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 ());
