https://gcc.gnu.org/g:01e2a53cb84f959f400af79172843e4bc906ff9a

commit r15-8124-g01e2a53cb84f959f400af79172843e4bc906ff9a
Author: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>
Date:   Fri May 3 16:30:06 2024 +0200

    gccrs: Change lookup_hir_implitem return type
    
    Wrap the return type within an optional. Now return the parent id within
    a pair instead of taking an out reference.
    
    gcc/rust/ChangeLog:
    
            * backend/rust-compile-item.cc (CompileItem::visit): Change call 
site
            to accept new return type.
            * backend/rust-compile-resolve-path.cc 
(HIRCompileBase::query_compile):
            Likewise.
            * backend/rust-mangle-v0.cc (v0_path): Likewise.
            * checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit):
            Likewise.
            * checks/lints/rust-lint-marklive.cc (MarkLive::go): Likewise.
            (MarkLive::visit): Likewise.
            * typecheck/rust-type-util.cc (query_type): Likewise.
            * util/rust-hir-map.cc (Mappings::insert_hir_implitem): Likewise.
            (Mappings::lookup_hir_implitem): Change return type.
            * util/rust-hir-map.h: Update the function's prototype.
    
    Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>

Diff:
---
 gcc/rust/backend/rust-compile-item.cc         |  7 ++----
 gcc/rust/backend/rust-compile-resolve-path.cc | 12 ++++------
 gcc/rust/backend/rust-mangle-v0.cc            | 10 ++++----
 gcc/rust/checks/errors/rust-unsafe-checker.cc |  6 ++---
 gcc/rust/checks/lints/rust-lint-marklive.cc   | 33 ++++++---------------------
 gcc/rust/typecheck/rust-type-util.cc          | 16 +++++--------
 gcc/rust/util/rust-hir-map.cc                 | 14 ++++--------
 gcc/rust/util/rust-hir-map.h                  | 10 ++++----
 8 files changed, 35 insertions(+), 73 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-item.cc 
b/gcc/rust/backend/rust-compile-item.cc
index 9d65b610ec58..e7b3a17edf7a 100644
--- a/gcc/rust/backend/rust-compile-item.cc
+++ b/gcc/rust/backend/rust-compile-item.cc
@@ -152,15 +152,12 @@ CompileItem::visit (HIR::Function &function)
     {
       // if this is part of a trait impl block which is not generic we need to
       // ensure associated types are setup
-      HirId parent_impl_block = UNKNOWN_HIRID;
       HirId id = function.get_mappings ().get_hirid ();
-      HIR::ImplItem *impl_item
-       = ctx->get_mappings ().lookup_hir_implitem (id, &parent_impl_block);
-      if (impl_item != nullptr)
+      if (auto impl_item = ctx->get_mappings ().lookup_hir_implitem (id))
        {
          Resolver::AssociatedImplTrait *impl = nullptr;
          bool found = ctx->get_tyctx ()->lookup_associated_trait_impl (
-           parent_impl_block, &impl);
+           impl_item->second, &impl);
          if (found)
            impl->setup_raw_associated_types ();
        }
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc 
b/gcc/rust/backend/rust-compile-resolve-path.cc
index c27074f89a45..7c9b303b8519 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.cc
+++ b/gcc/rust/backend/rust-compile-resolve-path.cc
@@ -238,18 +238,14 @@ HIRCompileBase::query_compile (HirId ref, TyTy::BaseType 
*lookup,
            }
        }
 
-      HirId parent_impl_id = UNKNOWN_HIRID;
-      HIR::ImplItem *resolved_item
-       = ctx->get_mappings ().lookup_hir_implitem (ref, &parent_impl_id);
-      bool is_impl_item = resolved_item != nullptr;
-      if (is_impl_item)
+      if (auto resolved_item = ctx->get_mappings ().lookup_hir_implitem (ref))
        {
          if (!lookup->has_substitutions_defined ())
-           return CompileInherentImplItem::Compile (resolved_item, ctx,
+           return CompileInherentImplItem::Compile (resolved_item->first, ctx,
                                                     nullptr, true, expr_locus);
          else
-           return CompileInherentImplItem::Compile (resolved_item, ctx, lookup,
-                                                    true, expr_locus);
+           return CompileInherentImplItem::Compile (resolved_item->first, ctx,
+                                                    lookup, true, expr_locus);
        }
       else
        {
diff --git a/gcc/rust/backend/rust-mangle-v0.cc 
b/gcc/rust/backend/rust-mangle-v0.cc
index 0b6d9455242b..261e84405d5b 100644
--- a/gcc/rust/backend/rust-mangle-v0.cc
+++ b/gcc/rust/backend/rust-mangle-v0.cc
@@ -384,17 +384,15 @@ v0_path (Rust::Compile::Context *ctx, const 
TyTy::BaseType *ty,
 
     auto hir_id = hid.value ();
 
-    HirId parent_impl_id = UNKNOWN_HIRID;
-    HIR::ImplItem *impl_item
-      = mappings.lookup_hir_implitem (hir_id, &parent_impl_id);
     HIR::Expr *expr = mappings.lookup_hir_expr (hir_id);
 
-    if (impl_item != nullptr)
+    if (auto impl_item = mappings.lookup_hir_implitem (hir_id))
       {
-       switch (impl_item->get_impl_item_type ())
+       switch (impl_item->first->get_impl_item_type ())
          {
            case HIR::ImplItem::FUNCTION: {
-             HIR::Function *fn = static_cast<HIR::Function *> (impl_item);
+             HIR::Function *fn
+               = static_cast<HIR::Function *> (impl_item->first);
              v0path
                = v0_function_path (v0path, ctx, ty, fn->get_generic_params (),
                                    v0_identifier (seg.get ()));
diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.cc 
b/gcc/rust/checks/errors/rust-unsafe-checker.cc
index 19a0489297fa..8d986c72eda5 100644
--- a/gcc/rust/checks/errors/rust-unsafe-checker.cc
+++ b/gcc/rust/checks/errors/rust-unsafe-checker.cc
@@ -449,11 +449,11 @@ UnsafeChecker::visit (MethodCallExpr &expr)
                       &method_type);
 
   auto fn = *static_cast<TyTy::FnType *> (method_type);
-  auto method = mappings.lookup_hir_implitem (fn.get_ref (), nullptr);
 
+  auto method = mappings.lookup_hir_implitem (fn.get_ref ());
   if (!unsafe_context.is_in_context () && method)
-    check_unsafe_call (static_cast<Function *> (method), expr.get_locus (),
-                      "method");
+    check_unsafe_call (static_cast<Function *> (method->first),
+                      expr.get_locus (), "method");
 
   expr.get_receiver ()->accept_vis (*this);
 
diff --git a/gcc/rust/checks/lints/rust-lint-marklive.cc 
b/gcc/rust/checks/lints/rust-lint-marklive.cc
index f64e8b59462e..24df933c8057 100644
--- a/gcc/rust/checks/lints/rust-lint-marklive.cc
+++ b/gcc/rust/checks/lints/rust-lint-marklive.cc
@@ -88,17 +88,9 @@ MarkLive::go (HIR::Crate &)
       scannedSymbols.emplace (hirId);
       liveSymbols.emplace (hirId);
       if (auto item = mappings.lookup_hir_item (hirId))
-       {
-         item.value ()->accept_vis (*this);
-       }
-      else
-       { // the item maybe inside a trait impl
-         HirId parent_impl_id = UNKNOWN_HIRID;
-         HIR::ImplItem *implItem
-           = mappings.lookup_hir_implitem (hirId, &parent_impl_id);
-         if (implItem != nullptr)
-           implItem->accept_vis (*this);
-       }
+       item.value ()->accept_vis (*this);
+      else if (auto implItem = mappings.lookup_hir_implitem (hirId))
+       implItem->first->accept_vis (*this);
     }
 }
 
@@ -123,21 +115,10 @@ MarkLive::visit (HIR::PathInExpression &expr)
   auto ref = hid.value ();
 
   // it must resolve to some kind of HIR::Item or HIR::InheritImplItem
-  tl::optional<HIR::Item *> resolved_item = mappings.lookup_hir_item (ref);
-  if (resolved_item)
-    {
-      mark_hir_id (resolved_item.value ()->get_mappings ().get_hirid ());
-    }
-  else
-    {
-      HirId parent_impl_id = UNKNOWN_HIRID;
-      HIR::ImplItem *resolved_item
-       = mappings.lookup_hir_implitem (ref, &parent_impl_id);
-      if (resolved_item != nullptr)
-       {
-         mark_hir_id (resolved_item->get_impl_mappings ().get_hirid ());
-       }
-    }
+  if (auto resolved_item = mappings.lookup_hir_item (ref))
+    mark_hir_id (resolved_item.value ()->get_mappings ().get_hirid ());
+  else if (auto resolved_item = mappings.lookup_hir_implitem (ref))
+    mark_hir_id (resolved_item->first->get_impl_mappings ().get_hirid ());
 }
 
 void
diff --git a/gcc/rust/typecheck/rust-type-util.cc 
b/gcc/rust/typecheck/rust-type-util.cc
index 05ac58bc18c9..0ed712473536 100644
--- a/gcc/rust/typecheck/rust-type-util.cc
+++ b/gcc/rust/typecheck/rust-type-util.cc
@@ -70,20 +70,16 @@ query_type (HirId reference, TyTy::BaseType **result)
       return true;
     }
 
-  HirId parent_impl_id = UNKNOWN_HIRID;
-  HIR::ImplItem *impl_item
-    = mappings.lookup_hir_implitem (reference, &parent_impl_id);
-  if (impl_item != nullptr)
+  if (auto impl_item = mappings.lookup_hir_implitem (reference))
     {
-      auto impl_block = mappings.lookup_hir_impl_block (parent_impl_id);
-      rust_assert (impl_block);
+      auto impl_block
+       = mappings.lookup_hir_impl_block (impl_item->second).value ();
 
       // found an impl item
-      rust_debug_loc (impl_item->get_locus (), "resolved impl-item {%u} to",
-                     reference);
+      rust_debug_loc (impl_item->first->get_locus (),
+                     "resolved impl-item {%u} to", reference);
 
-      *result
-       = TypeCheckItem::ResolveImplItem (*impl_block.value (), *impl_item);
+      *result = TypeCheckItem::ResolveImplItem (*impl_block, 
*impl_item->first);
       context->query_completed (reference);
       return true;
     }
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
index 4a78ae155256..89c990d965fb 100644
--- a/gcc/rust/util/rust-hir-map.cc
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -509,25 +509,21 @@ void
 Mappings::insert_hir_implitem (HirId parent_impl_id, HIR::ImplItem *item)
 {
   auto id = item->get_impl_mappings ().get_hirid ();
-  rust_assert (lookup_hir_implitem (id, nullptr) == nullptr);
+  rust_assert (!lookup_hir_implitem (id));
 
   hirImplItemMappings[id]
     = std::pair<HirId, HIR::ImplItem *> (parent_impl_id, item);
   insert_node_to_hir (item->get_impl_mappings ().get_nodeid (), id);
 }
 
-HIR::ImplItem *
-Mappings::lookup_hir_implitem (HirId id, HirId *parent_impl_id)
+tl::optional<std::pair<HIR::ImplItem *, HirId>>
+Mappings::lookup_hir_implitem (HirId id)
 {
   auto it = hirImplItemMappings.find (id);
   if (it == hirImplItemMappings.end ())
-    return nullptr;
-
-  std::pair<HirId, HIR::ImplItem *> &ref = it->second;
-  if (parent_impl_id != nullptr)
-    *parent_impl_id = ref.first;
+    return tl::nullopt;
 
-  return ref.second;
+  return std::make_pair (it->second.second, it->second.first);
 }
 
 void
diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h
index 3ca980ea3a92..a587ccca7539 100644
--- a/gcc/rust/util/rust-hir-map.h
+++ b/gcc/rust/util/rust-hir-map.h
@@ -141,7 +141,9 @@ public:
   tl::optional<HIR::Module *> lookup_module (HirId id);
 
   void insert_hir_implitem (HirId parent_impl_id, HIR::ImplItem *item);
-  HIR::ImplItem *lookup_hir_implitem (HirId id, HirId *parent_impl_id);
+  // Optional<ImpItem, ParentImpl Hir id>
+  tl::optional<std::pair<HIR::ImplItem *, HirId>>
+  lookup_hir_implitem (HirId id);
 
   void insert_hir_expr (HIR::Expr *expr);
   HIR::Expr *lookup_hir_expr (HirId id);
@@ -209,11 +211,7 @@ public:
   void iterate_trait_items (
     std::function<bool (HIR::TraitItem *item, HIR::Trait *)> cb);
 
-  bool is_impl_item (HirId id)
-  {
-    HirId parent_impl_block_id = UNKNOWN_HIRID;
-    return lookup_hir_implitem (id, &parent_impl_block_id) != nullptr;
-  }
+  bool is_impl_item (HirId id) { return lookup_hir_implitem (id).has_value (); 
}
 
   void insert_trait_item_mapping (HirId trait_item_id, HIR::Trait *trait)
   {

Reply via email to