Skip to content

Commit

Permalink
hack: Work around MarkLive for lang items
Browse files Browse the repository at this point in the history
  • Loading branch information
CohenArthur committed Dec 24, 2024
1 parent 9337460 commit 079736a
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions gcc/rust/checks/lints/rust-lint-marklive.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#include "rust-lint-marklive.h"
#include "options.h"
#include "rust-hir-full.h"
#include "rust-hir-map.h"
#include "rust-hir-path.h"
#include "rust-name-resolver.h"
#include "rust-immutable-name-resolution-context.h"
#include "rust-system.h"
Expand Down Expand Up @@ -97,17 +99,25 @@ MarkLive::go (HIR::Crate &)
void
MarkLive::visit (HIR::PathInExpression &expr)
{
auto is_lang_item = expr.get_path_kind () == HIR::PathPattern::Kind::LangItem;

// We should iterate every path segment in order to mark the struct which
// is used in expression like Foo::bar(), we should mark the Foo alive.
expr.iterate_path_segments ([&] (HIR::PathExprSegment &seg) -> bool {
return visit_path_segment (seg);
});
if (!is_lang_item)
expr.iterate_path_segments ([&] (HIR::PathExprSegment &seg) -> bool {
return visit_path_segment (seg);
});

// after iterate the path segments, we should mark functions and associated
// functions alive.
NodeId ast_node_id = expr.get_mappings ().get_nodeid ();
NodeId ref_node_id = UNKNOWN_NODEID;
find_ref_node_id (ast_node_id, ref_node_id);

if (is_lang_item)
ref_node_id = *Analysis::Mappings::get ().lookup_lang_item_node (
expr.get_lang_item_kind ());
else
find_ref_node_id (ast_node_id, ref_node_id);

// node back to HIR
tl::optional<HirId> hid = mappings.lookup_node_to_hir (ref_node_id);
Expand Down

0 comments on commit 079736a

Please sign in to comment.