]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Map locations to placeholder regions
authorKushal Pal <kushalpal109@gmail.com>
Thu, 25 Jul 2024 11:57:35 +0000 (11:57 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Wed, 19 Mar 2025 14:32:03 +0000 (15:32 +0100)
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 <kushalpal109@gmail.com>
gcc/rust/checks/errors/borrowck/rust-bir-builder.h
gcc/rust/checks/errors/borrowck/rust-bir.h

index b7d0651fcddb69e90b7a65050437fea51914ec5d..e3d61b5b36e8f7dbfbd0a168979d1e91b587e3d9 100644 (file)
@@ -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
index 583d1ebd58fa5fe38d67c6d4d5931928fa3b362f..e8b7e39c550ffbdbb76f14b2a666ba5beee3eb0e 100644 (file)
@@ -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;
 };