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