https://gcc.gnu.org/g:bf8c98f0798ab5afabfd23a298b154e62b81d64f
commit r16-6360-gbf8c98f0798ab5afabfd23a298b154e62b81d64f Author: Lucas Ly Ba <[email protected]> Date: Fri Nov 14 21:07:00 2025 +0000 gccrs: refactor unused var lint gcc/rust/ChangeLog: * checks/lints/unused-var/rust-unused-var-checker.cc (UnusedVarChecker::visit): Change unused name warning to unused variable warning. * checks/lints/unused-var/rust-unused-var-collector.cc (UnusedVarCollector::visit): Remove useless methods. * checks/lints/unused-var/rust-unused-var-collector.h: Same here. * checks/lints/unused-var/rust-unused-var-context.cc (UnusedVarContext::add_variable): Add used variables to set. (UnusedVarContext::mark_used): Remove method. (UnusedVarContext::is_variable_used): Check if the set contains the hir id linked to a variable. (UnusedVarContext::as_string): Refactor method for new set. * checks/lints/unused-var/rust-unused-var-context.h: Refactor methods. * lang.opt: Change description for unused check flag. gcc/testsuite/ChangeLog: * rust/compile/static_item_0.rs: Modify warning output. * rust/compile/template_function_0.rs: Modify warning output. Signed-off-by: Lucas Ly Ba <[email protected]> Diff: --- .../lints/unused-var/rust-unused-var-checker.cc | 26 +++++++++++----------- .../lints/unused-var/rust-unused-var-collector.cc | 23 +++---------------- .../lints/unused-var/rust-unused-var-collector.h | 5 +---- .../lints/unused-var/rust-unused-var-context.cc | 16 ++++--------- .../lints/unused-var/rust-unused-var-context.h | 4 +--- gcc/rust/lang.opt | 2 +- gcc/testsuite/rust/compile/static_item_0.rs | 2 +- gcc/testsuite/rust/compile/template_function_0.rs | 2 +- 8 files changed, 25 insertions(+), 55 deletions(-) diff --git a/gcc/rust/checks/lints/unused-var/rust-unused-var-checker.cc b/gcc/rust/checks/lints/unused-var/rust-unused-var-checker.cc index e4df446f783e..98111585eab0 100644 --- a/gcc/rust/checks/lints/unused-var/rust-unused-var-checker.cc +++ b/gcc/rust/checks/lints/unused-var/rust-unused-var-checker.cc @@ -21,6 +21,7 @@ #include "rust-hir-item.h" #include "options.h" +#include "rust-keyword-values.h" namespace Rust { namespace Analysis { @@ -38,14 +39,15 @@ UnusedVarChecker::go (HIR::Crate &crate) for (auto &item : crate.get_items ()) item->accept_vis (*this); } + void UnusedVarChecker::visit (HIR::ConstantItem &item) { std::string var_name = item.get_identifier ().as_string (); - bool starts_with_under_score = var_name.compare (0, 1, "_") == 0; auto id = item.get_mappings ().get_hirid (); - if (!unused_var_context.is_variable_used (id) && !starts_with_under_score) - rust_warning_at (item.get_locus (), OPT_Wunused_variable, "unused name %qs", + if (!unused_context.is_variable_used (id) && var_name[0] != '_') + rust_warning_at (item.get_locus (), OPT_Wunused_variable, + "unused variable %qs", item.get_identifier ().as_string ().c_str ()); } @@ -53,10 +55,10 @@ void UnusedVarChecker::visit (HIR::StaticItem &item) { std::string var_name = item.get_identifier ().as_string (); - bool starts_with_under_score = var_name.compare (0, 1, "_") == 0; auto id = item.get_mappings ().get_hirid (); - if (!unused_var_context.is_variable_used (id) && !starts_with_under_score) - rust_warning_at (item.get_locus (), OPT_Wunused_variable, "unused name %qs", + if (!unused_context.is_variable_used (id) && var_name[0] != '_') + rust_warning_at (item.get_locus (), OPT_Wunused_variable, + "unused variable %qs", item.get_identifier ().as_string ().c_str ()); } @@ -69,12 +71,11 @@ void UnusedVarChecker::visit (HIR::IdentifierPattern &pattern) { std::string var_name = pattern.get_identifier ().as_string (); - bool starts_with_under_score = var_name.compare (0, 1, "_") == 0; auto id = pattern.get_mappings ().get_hirid (); - if (!unused_var_context.is_variable_used (id) && var_name != "self" - && !starts_with_under_score) + if (!unused_context.is_variable_used (id) + && var_name != Values::Keywords::SELF && var_name[0] != '_') rust_warning_at (pattern.get_locus (), OPT_Wunused_variable, - "unused name %qs", + "unused variable %qs", pattern.get_identifier ().as_string ().c_str ()); } void @@ -87,9 +88,8 @@ UnusedVarChecker::visit (HIR::AssignmentExpr &expr) NodeId ast_node_id = lhs.get_mappings ().get_nodeid (); NodeId def_id = nr_context.lookup (ast_node_id).value (); HirId id = mappings.lookup_node_to_hir (def_id).value (); - if (unused_var_context.is_variable_assigned (id, - lhs.get_mappings ().get_hirid ()) - && !starts_with_under_score) + if (unused_context.is_variable_assigned (id, lhs.get_mappings ().get_hirid ()) + && var_name[0] != '_') rust_warning_at (lhs.get_locus (), OPT_Wunused_variable, "unused assignment %qs", var_name.c_str ()); } diff --git a/gcc/rust/checks/lints/unused-var/rust-unused-var-collector.cc b/gcc/rust/checks/lints/unused-var/rust-unused-var-collector.cc index e9e98c5f2b68..0d601dd51972 100644 --- a/gcc/rust/checks/lints/unused-var/rust-unused-var-collector.cc +++ b/gcc/rust/checks/lints/unused-var/rust-unused-var-collector.cc @@ -39,42 +39,25 @@ UnusedVarCollector::go (HIR::Crate &crate) item->accept_vis (*this); } -void -UnusedVarCollector::visit (HIR::ConstantItem &item) -{ - unused_var_context.add_variable (item.get_mappings ().get_hirid ()); - walk (item); -} - -void -UnusedVarCollector::visit (HIR::StaticItem &item) -{ - unused_var_context.add_variable (item.get_mappings ().get_hirid ()); - walk (item); -} - -void -UnusedVarCollector::visit (HIR::IdentifierPattern &pattern) -{ - unused_var_context.add_variable (pattern.get_mappings ().get_hirid ()); -} - void UnusedVarCollector::visit (HIR::PathInExpression &expr) { mark_path_used (expr); + walk (expr); } void UnusedVarCollector::visit (HIR::QualifiedPathInExpression &expr) { mark_path_used (expr); + walk (expr); } void UnusedVarCollector::visit (HIR::StructExprFieldIdentifier &ident) { mark_path_used (ident); + walk (ident); } void UnusedVarCollector::visit (HIR::AssignmentExpr &expr) diff --git a/gcc/rust/checks/lints/unused-var/rust-unused-var-collector.h b/gcc/rust/checks/lints/unused-var/rust-unused-var-collector.h index e3fed0c29466..d792e7d6c055 100644 --- a/gcc/rust/checks/lints/unused-var/rust-unused-var-collector.h +++ b/gcc/rust/checks/lints/unused-var/rust-unused-var-collector.h @@ -42,9 +42,6 @@ private: using HIR::DefaultHIRVisitor::visit; virtual void visit (HIR::PathInExpression &expr) override; virtual void visit (HIR::StructExprFieldIdentifier &ident) override; - virtual void visit (HIR::ConstantItem &item) override; - virtual void visit (HIR::StaticItem &item) override; - virtual void visit (HIR::IdentifierPattern &pattern) override; virtual void visit (HIR::QualifiedPathInExpression &expr) override; virtual void visit (HIR::AssignmentExpr &expr) override; @@ -59,7 +56,7 @@ private: template <typename T> void mark_path_used (T &path_expr) { auto def_id = get_def_id (path_expr); - unused_var_context.mark_used (def_id); + unused_var_context.add_variable (def_id); unused_var_context.remove_assign (def_id); } }; diff --git a/gcc/rust/checks/lints/unused-var/rust-unused-var-context.cc b/gcc/rust/checks/lints/unused-var/rust-unused-var-context.cc index 435fba46a8f7..50bb85b40d38 100644 --- a/gcc/rust/checks/lints/unused-var/rust-unused-var-context.cc +++ b/gcc/rust/checks/lints/unused-var/rust-unused-var-context.cc @@ -23,22 +23,15 @@ namespace Analysis { void UnusedVarContext::add_variable (HirId id) -{ - if (is_used.find (id) == is_used.end ()) - is_used.insert ({id, false}); -} -void -UnusedVarContext::mark_used (HirId id) { - is_used[id] = true; + used_vars.emplace (id); } bool UnusedVarContext::is_variable_used (HirId id) const { - auto it = is_used.find (id); - return it != is_used.end () && it->second; + return used_vars.find (id) != used_vars.end (); } void @@ -66,10 +59,9 @@ UnusedVarContext::as_string () const { std::stringstream ss; ss << "UnusedVarContext: "; - for (const auto &pair : is_used) + for (const auto &v : used_vars) { - ss << "HirId: " << pair.first << " Used: " << (pair.second ? "Yes" : "No") - << "\n"; + ss << "HirId: " << v << "\n"; } return ss.str (); } diff --git a/gcc/rust/checks/lints/unused-var/rust-unused-var-context.h b/gcc/rust/checks/lints/unused-var/rust-unused-var-context.h index bde793defb8a..75d358abbbad 100644 --- a/gcc/rust/checks/lints/unused-var/rust-unused-var-context.h +++ b/gcc/rust/checks/lints/unused-var/rust-unused-var-context.h @@ -25,9 +25,7 @@ class UnusedVarContext { public: void add_variable (HirId id); - void mark_used (HirId id); bool is_variable_used (HirId id) const; - void add_assign (HirId id_def, HirId id); void remove_assign (HirId id_def); bool is_variable_assigned (HirId id_def, HirId id); @@ -35,7 +33,7 @@ public: std::string as_string () const; private: - std::map<HirId, bool> is_used; + std::unordered_set<HirId> used_vars; std::map<HirId, std::vector<HirId>> assigned_vars; }; diff --git a/gcc/rust/lang.opt b/gcc/rust/lang.opt index 67a2ae075c95..3c708bafe9f7 100644 --- a/gcc/rust/lang.opt +++ b/gcc/rust/lang.opt @@ -235,6 +235,6 @@ Define a built-in offset_of macro in the compiler and assume it is present frust-unused-check-2.0 Rust Var(flag_unused_check_2_0) -Use the new unused variable check instead of old one +Use the new unused variable check implementation. ; This comment is to ensure we retain the blank line above. diff --git a/gcc/testsuite/rust/compile/static_item_0.rs b/gcc/testsuite/rust/compile/static_item_0.rs index 69d8ec40927d..3fc74715c6d9 100644 --- a/gcc/testsuite/rust/compile/static_item_0.rs +++ b/gcc/testsuite/rust/compile/static_item_0.rs @@ -1,3 +1,3 @@ // { dg-additional-options "-frust-unused-check-2.0" } static TEST: usize = 1; -// { dg-warning "unused name" "" { target *-*-* } .-1 } \ No newline at end of file +// { dg-warning "unused variable .TEST." "" { target *-*-* } .-1 } diff --git a/gcc/testsuite/rust/compile/template_function_0.rs b/gcc/testsuite/rust/compile/template_function_0.rs index 4e1c2c7c9df5..7baaddd68b42 100644 --- a/gcc/testsuite/rust/compile/template_function_0.rs +++ b/gcc/testsuite/rust/compile/template_function_0.rs @@ -4,5 +4,5 @@ pub trait Sized {} pub fn test<T> (a: usize) -> () { - // { dg-warning "unused name" "" { target *-*-* } .-1 } + // { dg-warning "unused variable .a." "" { target *-*-* } .-1 } }
