https://gcc.gnu.org/g:ddda47c4fe5a9f5ed7e16820f6f45079af5bfa3b

commit ddda47c4fe5a9f5ed7e16820f6f45079af5bfa3b
Author: Kushal Pal <kushalpal...@gmail.com>
Date:   Thu Jul 25 11:57:35 2024 +0000

    Map locations to placeholder regions
    
    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>

Diff:
---
 gcc/rust/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 183e330fe956..3a92872a0cfa 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 8a0b96483e4c..3e4ea9a5d902 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;
 };

Reply via email to