]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Map locations to placeholder regions
authorKushal Pal <kushalpal109@gmail.com>
Thu, 25 Jul 2024 11:57:35 +0000 (11:57 +0000)
committerP-E-P <32375388+P-E-P@users.noreply.github.com>
Fri, 16 Aug 2024 12:31:02 +0000 (12:31 +0000)
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 183e330fe956b3482bb3d9dd592f9dd56ad3e508..3a92872a0cfa98c7486549b72c9bc67928c8a19d 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 8a0b96483e4cb31895dffb442fe8ad5ab25734ae..3e4ea9a5d902a0ea56ed6dc0dbc0a4504ef2346f 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;
 };