https://gcc.gnu.org/g:42195d3706f365a7d0cfff29ddd14f88b00e4c0f
commit r15-2593-g42195d3706f365a7d0cfff29ddd14f88b00e4c0f Author: Jakub Dupak <d...@jakubdupak.com> Date: Fri Feb 2 14:36:26 2024 +0100 gccrs: borrowck: BIR: Place tree traverse API gcc/rust/ChangeLog: * checks/errors/borrowck/rust-bir-place.h: Create place tree traverse API. Signed-off-by: Jakub Dupak <d...@jakubdupak.com> Diff: --- gcc/rust/checks/errors/borrowck/rust-bir-place.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-place.h b/gcc/rust/checks/errors/borrowck/rust-bir-place.h index ccc820121cc4..e62ec3557ad4 100644 --- a/gcc/rust/checks/errors/borrowck/rust-bir-place.h +++ b/gcc/rust/checks/errors/borrowck/rust-bir-place.h @@ -229,6 +229,29 @@ public: places[place].tyty}); } + template <typename FN> void for_each_path_from_root (PlaceId var, FN fn) const + { + PlaceId current = var; + current = places[current].path.first_child; + while (current != INVALID_PLACE) + { + fn (current); + for_each_path_from_root (current, fn); + current = places[current].path.next_sibling; + } + } + + template <typename FN> + void for_each_path_segment (PlaceId place_id, FN fn) const + { + PlaceId current = place_id; + while (current != INVALID_PLACE) + { + fn (current); + current = places[current].path.parent; + } + } + private: static bool is_type_copy (TyTy::BaseType *ty) {