]> git.feebdaed.xyz Git - 0xmirror/gcc.git/commitdiff
gccrs: refactor unused var lint
authorLucas Ly Ba <lucas.ly-ba@outlook.com>
Fri, 14 Nov 2025 21:07:00 +0000 (21:07 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 23 Dec 2025 11:16:49 +0000 (12:16 +0100)
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 <lucas.ly-ba@outlook.com>
gcc/rust/checks/lints/unused-var/rust-unused-var-checker.cc
gcc/rust/checks/lints/unused-var/rust-unused-var-collector.cc
gcc/rust/checks/lints/unused-var/rust-unused-var-collector.h
gcc/rust/checks/lints/unused-var/rust-unused-var-context.cc
gcc/rust/checks/lints/unused-var/rust-unused-var-context.h
gcc/rust/lang.opt
gcc/testsuite/rust/compile/static_item_0.rs
gcc/testsuite/rust/compile/template_function_0.rs

index e4df446f783e967c2a29ce645733d3c8ea1d3faa..98111585eab01ceb20fbb1a404a61e7ce275a400 100644 (file)
@@ -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 ());
 }
index e9e98c5f2b685427b54aee3a917794aedb6f04a3..0d601dd5197285dd56b1484222096bd4092f901c 100644 (file)
@@ -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)
index e3fed0c29466e1731f704abf0430926ad1e43cd8..d792e7d6c0552686d33ca7aed6bb350f21f80326 100644 (file)
@@ -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);
   }
 };
index 435fba46a8f7788b58b0bb8c3a2dc9908f1e3edf..50bb85b40d38f57b9f5eed19756f373c46e7296d 100644 (file)
@@ -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 ();
 }
index bde793defb8a3056a0cef67cb33922ff550b50f3..75d358abbbada13d60c1025c867f442130928a28 100644 (file)
@@ -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;
 };
 
index 67a2ae075c9554bba6396539662178d7e68b02b2..3c708bafe9f784c40c5383ce5436acbd73097f69 100644 (file)
@@ -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.
index 69d8ec40927ddedd3321e3902026a82690620541..3fc74715c6d9da7a1ff64acf353cfa2a0f5198fb 100644 (file)
@@ -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 }
index 4e1c2c7c9df59cc24eaaebb2e6e9c7b655b2e03e..7baaddd68b42371c35ee4a90c9c400b59c3a1db6 100644 (file)
@@ -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 }
 }