Branch data Line data Source code
1 : : // Copyright (C) 2021-2024 Free Software Foundation, Inc.
2 : :
3 : : // This file is part of GCC.
4 : :
5 : : // GCC is free software; you can redistribute it and/or modify it under
6 : : // the terms of the GNU General Public License as published by the Free
7 : : // Software Foundation; either version 3, or (at your option) any later
8 : : // version.
9 : :
10 : : // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 : : // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 : : // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 : : // for more details.
14 : :
15 : : // You should have received a copy of the GNU General Public License
16 : : // along with GCC; see the file COPYING3. If not see
17 : : // <http://www.gnu.org/licenses/>.
18 : :
19 : : #include "rust-lint-unused-var.h"
20 : : #include "rust-gcc.h"
21 : :
22 : : namespace Rust {
23 : : namespace Analysis {
24 : :
25 : : static void
26 : 31263 : check_decl (tree *t)
27 : : {
28 : 31263 : rust_assert (TREE_CODE (*t) == VAR_DECL || TREE_CODE (*t) == PARM_DECL
29 : : || TREE_CODE (*t) == CONST_DECL);
30 : :
31 : 31263 : tree var_name = DECL_NAME (*t);
32 : 31263 : const char *var_name_ptr = IDENTIFIER_POINTER (var_name);
33 : 31263 : bool starts_with_under_score = strncmp (var_name_ptr, "_", 1) == 0;
34 : :
35 : 31263 : bool is_constant = TREE_CODE (*t) == CONST_DECL;
36 : : // if (!is_constant)
37 : : // {
38 : : // debug_tree (*t);
39 : : // rust_debug ("found var-decl: used %s artifical %s underscore %s name
40 : : // %s",
41 : : // TREE_USED (*t) ? "true" : "false",
42 : : // DECL_ARTIFICIAL (*t) ? "true" : "false",
43 : : // starts_with_under_score ? "true" : "false", var_name_ptr);
44 : : // }
45 : :
46 : 31263 : if (!TREE_USED (*t) && !DECL_ARTIFICIAL (*t) && !starts_with_under_score)
47 : : {
48 : 4060 : warning_at (DECL_SOURCE_LOCATION (*t),
49 : : is_constant ? OPT_Wunused_const_variable_
50 : : : OPT_Wunused_variable,
51 : : "unused name %qE", *t);
52 : : }
53 : 31263 : }
54 : :
55 : : static tree
56 : 218318 : unused_var_walk_fn (tree *t, int *, void *)
57 : : {
58 : 218318 : switch (TREE_CODE (*t))
59 : : {
60 : 24169 : case VAR_DECL:
61 : 24169 : case CONST_DECL:
62 : 24169 : check_decl (t);
63 : 24169 : break;
64 : :
65 : : default:
66 : : break;
67 : : }
68 : 218318 : return NULL_TREE;
69 : : }
70 : :
71 : : void
72 : 3290 : UnusedVariables::Lint (Compile::Context &ctx)
73 : : {
74 : 12793 : for (auto &fndecl : ctx.get_func_decls ())
75 : : {
76 : 16111 : for (tree p = DECL_ARGUMENTS (fndecl); p != NULL_TREE; p = DECL_CHAIN (p))
77 : : {
78 : 6608 : check_decl (&p);
79 : : }
80 : :
81 : 9503 : walk_tree_without_duplicates (&DECL_SAVED_TREE (fndecl),
82 : : &unused_var_walk_fn, &ctx);
83 : : }
84 : :
85 : 3328 : for (auto &var : ctx.get_var_decls ())
86 : : {
87 : 38 : tree decl = var->get_decl ();
88 : 38 : check_decl (&decl);
89 : : }
90 : :
91 : 3738 : for (auto &const_decl : ctx.get_const_decls ())
92 : : {
93 : 448 : check_decl (&const_decl);
94 : : }
95 : 3290 : }
96 : :
97 : : } // namespace Analysis
98 : : } // namespace Rust
|