From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7905) id 095B93858C5E; Tue, 21 Feb 2023 11:57:00 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 095B93858C5E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1676980620; bh=lp20S2qPU0FnbgX3vPCtXrqr7afcI0n1cDq8UxJIZx0=; h=From:To:Subject:Date:From; b=TzkXTEXW9yO9N8Z9X3vi1aC4nfBZBQnr/0XLJB1cFFGizG0b49bpZXHlc2/7kucJ7 GKP3Zirvo5tFE6u+XzZDMIzaXZ2Gw9KGLj4eChnymE6WhwaDRwEKylWuzWtkHgPAeT N2Z7FCnqMxxg5lpXPwlM85a10ck7f8JKyA/Iijo8= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Arthur Cohen To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-6174] gccrs: Support type resolution on super traits on dyn objects X-Act-Checkin: gcc X-Git-Author: Philip Herron X-Git-Refname: refs/heads/master X-Git-Oldrev: 522197469179e786e59202a40f2adf9dd95c8ddd X-Git-Newrev: 13556413e3841460d88c7a63c8a3049399f6b28e Message-Id: <20230221115700.095B93858C5E@sourceware.org> Date: Tue, 21 Feb 2023 11:57:00 +0000 (GMT) List-Id: https://gcc.gnu.org/g:13556413e3841460d88c7a63c8a3049399f6b28e commit r13-6174-g13556413e3841460d88c7a63c8a3049399f6b28e Author: Philip Herron Date: Thu Oct 6 14:46:17 2022 +0100 gccrs: Support type resolution on super traits on dyn objects When checking if specified bounds satisfy other bounds we must lookup the super traits. To finish the support for super traits we need to redo the computation of method addresses to support super traits. Addresses #914 gcc/rust/ChangeLog: * backend/rust-compile.cc: Add note about missing support for super traits. * typecheck/rust-tyty.cc (BaseType::satisfies_bound): New function. (BaseType::bounds_compatible): New function. (DynamicObjectType::get_object_items): New function. * typecheck/rust-hir-trait-ref.h: Use new API to perform type resolution on dyn objects. Diff: --- gcc/rust/backend/rust-compile.cc | 2 ++ gcc/rust/typecheck/rust-hir-trait-ref.h | 24 ++++++++++++++++++++++ gcc/rust/typecheck/rust-tyty.cc | 35 +++++++++++---------------------- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc index 13f42438b56..db08b3d595b 100644 --- a/gcc/rust/backend/rust-compile.cc +++ b/gcc/rust/backend/rust-compile.cc @@ -247,6 +247,8 @@ HIRCompileBase::compute_address_for_trait_item ( // Algo: // check if there is an impl-item for this trait-item-ref first // else assert that the trait-item-ref has an implementation + // + // FIXME this does not support super traits TyTy::TypeBoundPredicateItem predicate_item = predicate->lookup_associated_item (ref->get_identifier ()); diff --git a/gcc/rust/typecheck/rust-hir-trait-ref.h b/gcc/rust/typecheck/rust-hir-trait-ref.h index 7eeb3300387..0df35265959 100644 --- a/gcc/rust/typecheck/rust-hir-trait-ref.h +++ b/gcc/rust/typecheck/rust-hir-trait-ref.h @@ -380,6 +380,16 @@ public: return item_refs; } + void get_trait_items_and_supers ( + std::vector &result) const + { + for (const auto &item : item_refs) + result.push_back (&item); + + for (const auto &super_trait : super_traits) + super_trait->get_trait_items_and_supers (result); + } + void on_resolved () { for (auto &item : item_refs) @@ -451,6 +461,20 @@ public: return trait_substs; } + bool satisfies_bound (const TraitReference &reference) const + { + if (is_equal (reference)) + return true; + + for (const auto &super_trait : super_traits) + { + if (super_trait->satisfies_bound (reference)) + return true; + } + + return false; + } + private: const HIR::Trait *hir_trait_ref; std::vector item_refs; diff --git a/gcc/rust/typecheck/rust-tyty.cc b/gcc/rust/typecheck/rust-tyty.cc index 64fe0f6cfb0..e2f79971337 100644 --- a/gcc/rust/typecheck/rust-tyty.cc +++ b/gcc/rust/typecheck/rust-tyty.cc @@ -136,22 +136,18 @@ bool BaseType::satisfies_bound (const TypeBoundPredicate &predicate) const { const Resolver::TraitReference *query = predicate.get (); - for (auto &bound : specified_bounds) + for (const auto &bound : specified_bounds) { const Resolver::TraitReference *item = bound.get (); - bool found = item->get_mappings ().get_defid () - == query->get_mappings ().get_defid (); - if (found) + if (item->satisfies_bound (*query)) return true; } auto probed = Resolver::TypeBoundsProbe::Probe (this); - for (auto &b : probed) + for (const auto &b : probed) { const Resolver::TraitReference *bound = b.first; - bool found = bound->get_mappings ().get_defid () - == query->get_mappings ().get_defid (); - if (found) + if (bound->satisfies_bound (*query)) return true; } @@ -191,7 +187,6 @@ BaseType::bounds_compatible (const BaseType &other, Location locus, rust_error_at (r, "bounds not satisfied for %s %<%s%> is not satisfied", other.get_name ().c_str (), missing_preds.c_str ()); - // rust_assert (!emit_error); } } @@ -2956,23 +2951,15 @@ DynamicObjectType::get_object_items () const for (auto &bound : get_specified_bounds ()) { const Resolver::TraitReference *trait = bound.get (); - for (auto &item : trait->get_trait_items ()) - { - if (item.get_trait_item_type () - == Resolver::TraitItemReference::TraitItemType::FN - && item.is_object_safe ()) - items.push_back ({&item, &bound}); - } + std::vector trait_items; + trait->get_trait_items_and_supers (trait_items); - for (auto &super_trait : trait->get_super_traits ()) + for (auto &item : trait_items) { - for (auto &item : super_trait->get_trait_items ()) - { - if (item.get_trait_item_type () - == Resolver::TraitItemReference::TraitItemType::FN - && item.is_object_safe ()) - items.push_back ({&item, &bound}); - } + if (item->get_trait_item_type () + == Resolver::TraitItemReference::TraitItemType::FN + && item->is_object_safe ()) + items.push_back ({item, &bound}); } } return items;