From: Lucas Ly Ba <[email protected]>

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]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/0c595a7f9e894bbe4e8a65688681394fb865205c

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4285

 .../unused-var/rust-unused-var-checker.cc     | 26 +++++++++----------
 .../unused-var/rust-unused-var-collector.cc   | 23 +++-------------
 .../unused-var/rust-unused-var-collector.h    |  5 +---
 .../unused-var/rust-unused-var-context.cc     | 16 +++---------
 .../unused-var/rust-unused-var-context.h      |  4 +--
 gcc/rust/lang.opt                             |  2 +-
 gcc/testsuite/rust/compile/static_item_0.rs   |  2 +-
 .../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 e4df446f7..98111585e 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 e9e98c5f2..0d601dd51 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 e3fed0c29..d792e7d6c 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 435fba46a..50bb85b40 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 bde793def..75d358abb 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 67a2ae075..3c708bafe 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 69d8ec409..3fc74715c 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 4e1c2c7c9..7baaddd68 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 }
 }
-- 
2.52.0

Reply via email to