From: Lucas Ly Ba Date: Fri, 14 Nov 2025 21:07:00 +0000 (+0000) Subject: gccrs: refactor unused var lint X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf8c98f0798ab5afabfd23a298b154e62b81d64f;p=thirdparty%2Fgcc.git 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 --- 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 e4df446f783..98111585eab 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 e9e98c5f2b6..0d601dd5197 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 e3fed0c2946..d792e7d6c05 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 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 435fba46a8f..50bb85b40d3 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 bde793defb8..75d358abbba 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 is_used; + std::unordered_set used_vars; std::map> assigned_vars; }; diff --git a/gcc/rust/lang.opt b/gcc/rust/lang.opt index 67a2ae075c9..3c708bafe9f 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 69d8ec40927..3fc74715c6d 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 4e1c2c7c9df..7baaddd68b4 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 (a: usize) -> () { - // { dg-warning "unused name" "" { target *-*-* } .-1 } + // { dg-warning "unused variable .a." "" { target *-*-* } .-1 } }