diff options
author | Kushal Pal <kushalpal109@gmail.com> | 2024-07-25 11:57:35 +0000 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2025-03-19 15:32:03 +0100 |
commit | 6f009aedaff88e359aee82628bccf683315222c6 (patch) | |
tree | f77bd3299b9b24ed3a83e525fae33288eb754408 /gcc | |
parent | 1ed44d6cb29fda8d1ffc4bdee27d6dc0db4088fa (diff) | |
download | gcc-6f009aedaff88e359aee82628bccf683315222c6.zip gcc-6f009aedaff88e359aee82628bccf683315222c6.tar.gz gcc-6f009aedaff88e359aee82628bccf683315222c6.tar.bz2 |
gccrs: 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 <kushalpal109@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/checks/errors/borrowck/rust-bir-builder.h | 23 | ||||
-rw-r--r-- | gcc/rust/checks/errors/borrowck/rust-bir.h | 1 |
2 files changed, 24 insertions, 0 deletions
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-builder.h b/gcc/rust/checks/errors/borrowck/rust-bir-builder.h index b7d0651..e3d61b5 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 583d1eb..e8b7e39 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; }; |