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 }
 }

Reply via email to