From: Kushal Pal <kushalpal...@gmail.com>

Mapped placeholder regions to their respective HIR nodes so we can fetch
locations during error reporting.

gcc/rust/ChangeLog:

        * checks/errors/borrowck/rust-bir-builder.h: Map regions to
        their respective HIR nodes.
        * checks/errors/borrowck/rust-bir.h (struct Function):
        Add unordered_map to maintain the mapping.

Signed-off-by: Kushal Pal <kushalpal...@gmail.com>
---
 .../checks/errors/borrowck/rust-bir-builder.h | 23 +++++++++++++++++++
 gcc/rust/checks/errors/borrowck/rust-bir.h    |  1 +
 2 files changed, 24 insertions(+)

diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-builder.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-builder.h
index b7d0651fcdd..e3d61b5b36e 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-builder.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-builder.h
@@ -50,6 +50,8 @@ public:
       handle_param (param);
 
     handle_body (*function.get_definition ());
+    auto region_hir_map
+      = map_region_to_hir (function.get_generic_params (), 
ctx.fn_free_regions);
 
     return Function{
       std::move (ctx.place_db),
@@ -57,6 +59,7 @@ public:
       std::move (ctx.basic_blocks),
       std::move (ctx.fn_free_regions),
       std::move (universal_region_bounds),
+      std::move (region_hir_map),
       function.get_locus (),
     };
   }
@@ -161,6 +164,26 @@ private:
        push_return (return_location);
       }
   }
+
+  // Maps named lifetime parameters to their respective HIR node
+  const std::unordered_map<Polonius::Origin, HIR::LifetimeParam *>
+  map_region_to_hir (
+    const std::vector<std::unique_ptr<HIR::GenericParam>> &generic_params,
+    const FreeRegions &regions)
+  {
+    std::unordered_map<Polonius::Origin, HIR::LifetimeParam *> result;
+    size_t region_index = 0;
+    for (auto &generic_param : generic_params)
+      {
+       if (generic_param->get_kind ()
+           == HIR::GenericParam::GenericKind::LIFETIME)
+         {
+           result[regions[region_index++]]
+             = static_cast<HIR::LifetimeParam *> (generic_param.get ());
+         }
+      }
+    return result;
+  }
 };
 
 } // namespace BIR
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir.h 
b/gcc/rust/checks/errors/borrowck/rust-bir.h
index 583d1ebd58f..e8b7e39c550 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir.h
@@ -47,6 +47,7 @@ struct Function
   std::vector<BasicBlock> basic_blocks;
   FreeRegions universal_regions;
   std::vector<std::pair<FreeRegion, FreeRegion>> universal_region_bounds;
+  std::unordered_map<Polonius::Origin, HIR::LifetimeParam *> region_hir_map;
   location_t location;
 };
 
-- 
2.45.2

Reply via email to