From: Kushal Pal <[email protected]>
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 <[email protected]>
---
.../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 ®ions)
+ {
+ 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