# \[Feature:trunk\] unused variable warning

**URL:** <https://www.ruby-forum.com/t/feature-trunk-unused-variable-warning/190184>\
**Category:** Development\
**Created:** [June 17, 2010, 4:22pm UTC](https://www.ruby-forum.com/t/feature-trunk-unused-variable-warning/190184 "2010-06-17T16:22:14Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [June 17, 2010, 4:22pm UTC](https://www.ruby-forum.com/t/feature-trunk-unused-variable-warning/190184/1 "2010-06-17T16:22:14Z")

</div>

e$B$J$+$@$G$9!#e(B

[Ruby で変数宣言がほしい、とな？ - kなんとかの日記](http://d.hatena.ne.jp/kwatch/20100616/1276650107) e$B$K$"$k!"L$;HMQe(B  
e$BJQ?t$KBP$9$k7Y9p$r\<BAu$7$F$\_$^$7$?!#e(B

diff --git i/parse.y w/parse.y  
index ebe9fef…8dbbacf 100644  
— i/parse.y  
+++ w/parse.y  
@@ -99,6 +99,7 @@ struct vtable {  
struct local\_vars {  
struct vtable \*args;  
struct vtable \*vars;

- struct vtable \*used;  
struct local\_vars \*prev;  
};

@@ -167,7 +168,7 @@ vtable\_included(const struct vtable \* tbl, ID id)  
if (POINTER\_P(tbl)) {  
for (i = 0; i \< tbl-\>pos; i++) {  
if (tbl-\>tbl[i] == id) {

- 

```
           return 1;

```

- 

```
           return i+1;
       }
   }

```

}  
@@ -8916,6 +8917,27 @@ new\_args\_gen(struct parser\_params \*parser, NODE  
\*m, NODE \*o, ID r, NODE \*p, ID b  
ruby\_sourceline = saved\_line;  
return node;  
}
- 

+#define LVAR\_USED (1UL \<\< (sizeof(ID) \* CHAR\_BIT - 1))  
+  
+static void  
+warn\_unused\_var(struct parser\_params \*parser, struct local\_vars \*local)  
+{

- int i, cnt;
- ID \*v, \*u;
- 
- if (!local-\>used) return;
- v = local-\>vars-\>tbl;
- u = local-\>used-\>tbl;
- cnt = local-\>used-\>pos;
- if (cnt != local-\>vars-\>pos) {
- rb\_bug(“local-\>used-\>pos != local-\>vars-\>pos”);
- }
- for (i = 0; i \< cnt; ++i) {
- if (!v[i] || (u[i] & LVAR\_USED)) continue;
- rb\_compile\_warn(ruby\_sourcefile, (int)u[i], “assigned but unused  
variable %s”, rb\_id2name(v[i]));
- }  
+}  
#endif /\* !RIPPER \*/

static void  
@@ -8927,6 +8949,7 @@ local\_push\_gen(struct parser\_params \*parser, int  
inherit\_dvars)  
local-\>prev = lvtbl;  
local-\>args = vtable\_alloc(0);  
local-\>vars = vtable\_alloc(inherit\_dvars ? DVARS\_INHERIT :  
DVARS\_TOPSCOPE);

- local-\>used = RTEST(ruby\_verbose) ? vtable\_alloc(0) : 0;  
lvtbl = local;  
}

@@ -8934,6 +8957,10 @@ static void  
local\_pop\_gen(struct parser\_params \*parser)  
{  
struct local\_vars \*local = lvtbl-\>prev;

- if (lvtbl-\>used) {
- warn\_unused\_var(parser, lvtbl);
- vtable\_free(lvtbl-\>used);
- }  
vtable\_free(lvtbl-\>args);  
vtable\_free(lvtbl-\>vars);  
xfree(lvtbl);  
@@ -8982,28 +9009,37 @@ static int  
local\_var\_gen(struct parser\_params \*parser, ID id)  
{  
vtable\_add(lvtbl-\>vars, id);
- if (lvtbl-\>used) {
- vtable\_add(lvtbl-\>used, (ID)ruby\_sourceline);
- }  
return vtable\_size(lvtbl-\>vars) - 1;  
}

static int  
local\_id\_gen(struct parser\_params \*parser, ID id)  
{

- struct vtable \*vars, \*args;

- struct vtable \*vars, \*args, \*used;

- used = lvtbl-\>used;

- if (used) used = used-\>prev;  
}

- else if (vtable\_included(args, id)) {

- return 1;

- }  
else {

- return (vtable\_included(args, id) ||
- vtable\_included(vars, id));

- int i = vtable\_included(vars, id);
- if (i && used) used-\>tbl[i-1] |= LVAR\_USED;
- return i != 0;  
}  
}

@@ -9012,6 +9048,9 @@ dyna\_push\_gen(struct parser\_params \*parser)  
{  
lvtbl-\>args = vtable\_alloc(lvtbl-\>args);  
lvtbl-\>vars = vtable\_alloc(lvtbl-\>vars);

- if (lvtbl-\>used) {
- lvtbl-\>used = vtable\_alloc(lvtbl-\>used);
- }  
return lvtbl-\>args;  
}

@@ -9020,6 +9059,11 @@ dyna\_pop\_1(struct parser\_params \*parser)  
{  
struct vtable \*tmp;

- if ((tmp = lvtbl-\>used) != 0) {
- warn\_unused\_var(parser, lvtbl);
- lvtbl-\>used = lvtbl-\>used-\>prev;
- vtable\_free(tmp);
- }  
tmp = lvtbl-\>args;  
lvtbl-\>args = lvtbl-\>args-\>prev;  
vtable\_free(tmp);  
@@ -9051,20 +9095,24 @@ dyna\_in\_block\_gen(struct parser\_params \*parser)  
static int  
dvar\_defined\_gen(struct parser\_params \*parser, ID id)  
{

- struct vtable \*vars, \*args;

- struct vtable \*vars, \*args, \*used;

- int i;

- used = lvtbl-\>used;

- if (vtable\_included(vars, id)) {

- if ((i = vtable\_included(vars, id)) != 0) {

- 

```
 if (used) used->tbl[i-1] |= LVAR_USED;
 return 1;

```

}  
args = args-\>prev;  
vars = vars-\>prev;

- if (used) used = used-\>prev;  
}

- 
- def test\_unused\_variable

- assert\_in\_out\_err([“-we”, “a=1”], “”, [], [“-e:1: warning: assigned  
but unused variable a”])

- assert\_in\_out\_err([“-we”, “1.times do\n a=1\nend”], “”, [],  
[“-e:2: warning: assigned but unused variable a”])

- end  
end

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [June 17, 2010, 4:22pm UTC](https://www.ruby-forum.com/t/feature-trunk-unused-variable-warning/190184/2 "2010-06-17T16:22:18Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:41620] [Feature:trunk] unused variable  
warning”  
on Wed, 16 Jun 2010 17:44:02 +0900, Nobuyoshi N.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|[Ruby で変数宣言がほしい、とな？ - kなんとかの日記](http://d.hatena.ne.jp/kwatch/20100616/1276650107) e$B$K$"$k!"L$;HMQe(B  
|e$BJQ?t$KBP$9$k7Y9p$r\<BAu$7$F$\_$^$7$?!#e(B

e$B%3%\_%C%H$7$F$/$@$5$$$^$;$s$+!#e(B

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [June 17, 2010, 4:22pm UTC](https://www.ruby-forum.com/t/feature-trunk-unused-variable-warning/190184/3 "2010-06-17T16:22:36Z")

</div>

e$B%A%1%C%He(B #3446 e$B$,99?7$5$l$^$7$?!#e(B (by Nobuyoshi N.)

e$B%9%F!\<%?%9e(B Opene$B$+$ie(BClosede$B$KJQ99e(B  
e$B?JD=e(B % 0e$B$+$ie(B100e$B$KJQ99e(B

This issue was solved with changeset r28339.  
Nobuyoshi, thank you for reporting this issue.  
Your contribution to Ruby is greatly appreciated.  
May Ruby be with you.

* * *

[http://redmine.ruby-lang.org/issues/show/3446](http://redmine.ruby-lang.org/issues/show/3446)
