[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