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 ®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