# A = -(1) : warning: empty expression

**URL:** <https://www.ruby-forum.com/t/a-1-warning-empty-expression/110197>\
**Category:** Development\
**Created:** [July 24, 2007, 4:23am UTC](https://www.ruby-forum.com/t/a-1-warning-empty-expression/110197 "2007-07-24T04:23:27Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 24, 2007, 4:23am UTC](https://www.ruby-forum.com/t/a-1-warning-empty-expression/110197/1 "2007-07-24T04:23:27Z")

</div>

e$B0J2\<$N$h$&$K!"e(B-(1) e$B$Ge(B warning: empty expression  
e$B$H$J$j$^$9!#e(B

% ./ruby -ve ‘a = -(1)’  
ruby 1.9.0 (2007-07-23 patchlevel 0) [i686-linux]  
-e:1: warning: empty expression

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 24, 2007, 7:41am UTC](https://www.ruby-forum.com/t/a-1-warning-empty-expression/110197/2 "2007-07-24T07:41:38Z")

</div>

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

At Tue, 24 Jul 2007 11:22:33 +0900,  
Tanaka A. wrote in [ruby-dev:31293]:

> e$B0J2\<$N$h$&$K!"e(B-(1) e$B$Ge(B warning: empty expression e$B$H$J$j$^$9!#e(B

rippere$B$r%^!\<%8$7$?$H$-$N%\_%9$N$h$&$G$9!#e(B

e$B$D$$$G$J$N$Ge(Bvalue\_expr()e$B4XO"$r$A$g$C$H8+D\>$7$F$\_$^$7$?$,!“e(B  
a|=break e$B$de(B while break; end e$B$J$I$G2?2s$be(B void value  
expression  
e$B$H7+$jJV$5$l$k$N$O$”$^$j4r$7$/$J$5$=$&$G$9!#e(B

# Index: parse.y

— parse.y (revision 12843)  
+++ parse.y (working copy)  
@@ -318,4 +318,5 @@ static NODE\* node\_newnode(struct parser\_  
static NODE _cond\_gen(struct parser\_params_,NODE\*);  
#define cond(node) cond\_gen(parser, node)  
+#define cond\_value(node) cond(value\_expr(node))  
static NODE _logop\_gen(struct parser\_params_,enum  
node\_type,NODE\*,NODE\*);  
#define logop(type,node1,node2) logop\_gen(parser, type, node1, node2)  
@@ -326,5 +327,5 @@ static NODE _newline\_node(NODE_);  
static void fixpos(NODE\*,NODE\*);

-static int value\_expr\_gen(struct parser\_params\*,NODE\*);  
+static NODE _value\_expr\_gen(struct parser\_params_,NODE\*);  
static void void\_expr\_gen(struct parser\_params\*,NODE\*);  
static NODE _remove\_begin(NODE_);  
@@ -355,6 +356,8 @@ static NODE \*evstr2dstr\_gen(struct parse  
#define evstr2dstr(n) evstr2dstr\_gen(parser,n)

-static NODE _call\_op\_gen(struct parser\_params_,NODE\*,ID,int,NODE\*);  
-#define call\_op(recv,id,narg,arg1) call\_op\_gen(parser,  
recv,id,narg,arg1)  
+static NODE _call\_bin\_op\_gen(struct parser\_params_,NODE\*,ID,NODE\*);  
+#define call\_bin\_op(recv,id,arg1) call\_bin\_op\_gen(parser, recv,id,arg1)  
+static NODE _call\_uni\_op\_gen(struct parser\_params_,NODE\*,ID);  
+#define call\_uni\_op(recv,id) call\_uni\_op\_gen(parser, recv,id)

static NODE _new\_args\_gen(struct  
parser\_params_,NODE\*,NODE\*,ID,NODE\*,ID);  
@@ -369,4 +372,6 @@ static NODE _arg\_blk\_pass(NODE_,NODE\*);  
static NODE _new\_yield\_gen(struct parser\_params_,NODE\*);  
#define new\_yield(node) new\_yield\_gen(parser, node)  
+static NODE _new\_not\_gen(struct parser\_params_,NODE\*);  
+#define new\_not(node) new\_not\_gen(parser, node)

static NODE _gettable\_gen(struct parser\_params_,ID);  
@@ -963,5 +968,5 @@ stmt : keyword\_alias fitem {lex\_state =  
{  
/_%%%_/

- 

```
 $$ = node_assign($1, $3);

```

- 

```
 $$ = node_assign($1, value_expr($3));
   /*%
 $$ = dispatch2(assign, $1, $3);

```

@@ -997,5 +1002,5 @@ stmt : keyword\_alias fitem {lex\_state =  
else {  
$$ = $1;

- 

```
   $$->nd_value = call_op(gettable(vid),$2,1,$3);

```

- 

```
   $$->nd_value = NEW_CALL(gettable(vid), $2, NEW_LIST($3));
     }
 }

```

@@ -1092,5 +1097,5 @@ stmt : keyword\_alias fitem {lex\_state =  
{  
/_%%%_/

- 

```
 $$ = node_assign($1, $3);

```

- 

```
 $$ = node_assign($1, value_expr($3));
   /*%
 $$ = dispatch2(assign, $1, $3);

```

@@ -1138,5 +1143,5 @@ expr : command\_call  
{  
/_%%%_/

- 

```
 $$ = NEW_NOT(cond($2));

```

- 

```
 $$ = new_not($2);
   /*%
 $$ = dispatch2(unary, ripper_intern("not"), $2);

```

@@ -1146,5 +1151,5 @@ expr : command\_call  
{  
/_%%%_/

- 

```
 $$ = NEW_NOT(cond($2));

```

- 

```
 $$ = new_not($2);
   /*%
 $$ = dispatch2(unary, ID2SYM('!'), $2);

```

@@ -1758,5 +1763,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = node_assign($1, $3);

```

- 

```
 $$ = node_assign($1, value_expr($3));
   /*%
 $$ = dispatch2(assign, $1, $3);

```

@@ -1774,4 +1779,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 value_expr($3);
 if ($1) {
     ID vid = $1->nd_vid;

```

@@ -1789,5 +1795,5 @@ arg : lhs ‘=’ arg  
else {  
$$ = $1;

- 

```
   $$->nd_value = call_op(gettable(vid),$2,1,$3);

```

- 

```
   $$->nd_value = NEW_CALL(gettable(vid), $2, NEW_LIST($3));
     }
 }

```

@@ -1941,5 +1947,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, '+', 1, $3);

```

- 

```
 $$ = call_bin_op($1, '+', $3);
   /*%
 $$ = dispatch3(binary, $1, ID2SYM('+'), $3);

```

@@ -1949,5 +1955,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, '-', 1, $3);

```

- 

```
 $$ = call_bin_op($1, '-', $3);
   /*%
 $$ = dispatch3(binary, $1, ID2SYM('-'), $3);

```

@@ -1957,5 +1963,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, '*', 1, $3);

```

- 

```
 $$ = call_bin_op($1, '*', $3);
   /*%
 $$ = dispatch3(binary, $1, ID2SYM('*'), $3);

```

@@ -1965,5 +1971,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, '/', 1, $3);

```

- 

```
 $$ = call_bin_op($1, '/', $3);
   /*%
 $$ = dispatch3(binary, $1, ID2SYM('/'), $3);

```

@@ -1973,5 +1979,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, '%', 1, $3);

```

- 

```
 $$ = call_bin_op($1, '%', $3);
   /*%
 $$ = dispatch3(binary, $1, ID2SYM('%'), $3);

```

@@ -1981,5 +1987,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, tPOW, 1, $3);

```

- 

```
 $$ = call_bin_op($1, tPOW, $3);
   /*%
 $$ = dispatch3(binary, $1, ripper_intern("**"), $3);

```

@@ -1989,5 +1995,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op(call_op($2, tPOW, 1, $4), tUMINUS, 0, 0);

```

- 

```
 $$ = NEW_CALL(call_bin_op($2, tPOW, $4), tUMINUS, 0);
   /*%
 $$ = dispatch3(binary, $2, ripper_intern("**"), $4);

```

@@ -1998,5 +2004,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op(call_op($2, tPOW, 1, $4), tUMINUS, 0, 0);

```

- 

```
 $$ = NEW_CALL(call_bin_op($2, tPOW, $4), tUMINUS, 0);
   /*%
 $$ = dispatch3(binary, $2, ripper_intern("**"), $4);

```

@@ -2011,5 +2017,5 @@ arg : lhs ‘=’ arg  
}  
else {

- 

```
     $$ = call_op($2, tUPLUS, 0, 0);

```

- 

```
     $$ = call_uni_op($2, tUPLUS);
 }
   /*%

```

@@ -2020,5 +2026,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($2, tUMINUS, 0, 0);

```

- 

```
 $$ = call_uni_op($2, tUMINUS);
   /*%
 $$ = dispatch2(unary, ripper_intern("-@"), $2);

```

@@ -2028,5 +2034,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, '|', 1, $3);

```

- 

```
 $$ = call_bin_op($1, '|', $3);
   /*%
 $$ = dispatch3(binary, $1, ID2SYM('!'), $3);

```

@@ -2036,5 +2042,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, '^', 1, $3);

```

- 

```
 $$ = call_bin_op($1, '^', $3);
   /*%
 $$ = dispatch3(binary, $1, ID2SYM('^'), $3);

```

@@ -2044,5 +2050,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, '&', 1, $3);

```

- 

```
 $$ = call_bin_op($1, '&', $3);
   /*%
 $$ = dispatch3(binary, $1, ID2SYM('&'), $3);

```

@@ -2052,5 +2058,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, tCMP, 1, $3);

```

- 

```
 $$ = call_bin_op($1, tCMP, $3);
   /*%
 $$ = dispatch3(binary, $1, ripper_intern("<=>"), $3);

```

@@ -2060,5 +2066,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, '>', 1, $3);

```

- 

```
 $$ = call_bin_op($1, '>', $3);
   /*%
 $$ = dispatch3(binary, $1, ID2SYM('>'), $3);

```

@@ -2068,5 +2074,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, tGEQ, 1, $3);

```

- 

```
 $$ = call_bin_op($1, tGEQ, $3);
   /*%
 $$ = dispatch3(binary, $1, ripper_intern(">="), $3);

```

@@ -2076,5 +2082,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, '<', 1, $3);

```

- 

```
 $$ = call_bin_op($1, '<', $3);
   /*%
 $$ = dispatch3(binary, $1, ID2SYM('<'), $3);

```

@@ -2084,5 +2090,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, tLEQ, 1, $3);

```

- 

```
 $$ = call_bin_op($1, tLEQ, $3);
   /*%
 $$ = dispatch3(binary, $1, ripper_intern("<="), $3);

```

@@ -2092,5 +2098,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, tEQ, 1, $3);

```

- 

```
 $$ = call_bin_op($1, tEQ, $3);
   /*%
 $$ = dispatch3(binary, $1, ripper_intern("=="), $3);

```

@@ -2100,5 +2106,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, tEQQ, 1, $3);

```

- 

```
 $$ = call_bin_op($1, tEQQ, $3);
   /*%
 $$ = dispatch3(binary, $1, ripper_intern("==="), $3);

```

@@ -2108,5 +2114,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = NEW_NOT(call_op($1, tEQ, 1, $3));

```

- 

```
 $$ = NEW_NOT(call_bin_op($1, tEQ, $3));
   /*%
 $$ = dispatch3(binary, $1, ripper_intern("!="), $3);

```

@@ -2132,5 +2138,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = NEW_NOT(cond($2));

```

- 

```
 $$ = new_not($2);
   /*%
 $$ = dispatch2(unary, ID2SYM('!'), $2);

```

@@ -2140,5 +2146,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($2, '~', 0, 0);

```

- 

```
 $$ = call_uni_op($2, '~');
   /*%
 $$ = dispatch2(unary, ID2SYM('~'), $2);

```

@@ -2148,5 +2154,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, tLSHFT, 1, $3);

```

- 

```
 $$ = call_bin_op($1, tLSHFT, $3);
   /*%
 $$ = dispatch3(binary, $1, ripper_intern("<<"), $3);

```

@@ -2156,5 +2162,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = call_op($1, tRSHFT, 1, $3);

```

- 

```
 $$ = call_bin_op($1, tRSHFT, $3);
   /*%
 $$ = dispatch3(binary, $1, ripper_intern(">>"), $3);

```

@@ -2190,5 +2196,5 @@ arg : lhs ‘=’ arg  
{  
/_%%%_/

- 

```
 $$ = NEW_IF(cond($1), $3, $6);

```

- 

```
 $$ = NEW_IF(cond_value($1), $3, $6);
 fixpos($$, $1);
   /*%

```

@@ -2737,5 +2743,5 @@ primary : literal  
NODE \*zero = NEW\_LIST(NEW\_LIT(INT2FIX(0)));  
m-\>nd\_next = block\_append(

- 

```
   NEW_IF(cond(

```

- 

```
   NEW_IF(
       NEW_NODE(NODE_AND,
          NEW_CALL(NEW_CALL(NEW_DVAR(id), rb_intern("length"), 0),

```

@@ -2743,5 +2749,5 @@ primary : literal  
NEW\_CALL(NEW\_CALL(NEW\_DVAR(id), rb\_intern("[]"), zero),  
rb\_intern(“kind\_of?”), NEW\_LIST(NEW\_LIT(rb\_cArray))),

- 

```
          0)),

```

- 

```
          0),
     NEW_DASGN_CURR(id,
              NEW_CALL(NEW_DVAR(id), rb_intern("[]"), zero)),

```

@@ -7139,15 +7145,16 @@ new\_evstr\_gen(struct parser\_params \*pars

static NODE \*  
-call\_op\_gen(struct parser\_params \*parser, NODE \*recv, ID id, int narg,  
NODE \*arg1)  
+call\_bin\_op\_gen(struct parser\_params \*parser, NODE \*recv, ID id, NODE  
\*arg1)  
{

- value\_expr(recv);  
value\_expr(arg1);

- if (narg == 1) {
- value\_expr(arg1);
- arg1 = NEW\_LIST(arg1);
- }
- else {
- arg1 = 0;
- }
- return NEW\_CALL(recv, id, arg1);

- return NEW\_CALL(recv, id, NEW\_LIST(arg1));  
+}
- 

+static NODE \*  
+call\_uni\_op\_gen(struct parser\_params \*parser, NODE \*recv, ID id)  
+{

- value\_expr(recv);
- return NEW\_CALL(recv, id, 0);  
}

@@ -7327,6 +7334,4 @@ aryset\_gen(struct parser\_params \*parser,  
if (recv && nd\_type(recv) == NODE\_SELF)  
recv = (NODE \*)1;

- else
- value\_expr(recv);  
return NEW\_ATTRASGN(recv, tASET, idx);  
}  
@@ -7353,6 +7358,4 @@ attrset\_gen(struct parser\_params \*parser  
if (recv && nd\_type(recv) == NODE\_SELF)  
recv = (NODE \*)1;
- else
- value\_expr(recv);  
return NEW\_ATTRASGN(recv, rb\_id\_attrset(id), 0);  
}  
@@ -7413,10 +7416,9 @@ arg\_add\_gen(struct parser\_params \*parser  
}

-static NODE\*  
+static NODE \*  
node\_assign\_gen(struct parser\_params \*parser, NODE \*lhs, NODE \*rhs)  
{  
if (!lhs) return 0;

- value\_expr(rhs);  
switch (nd\_type(lhs)) {  
case NODE\_GASGN:  
@@ -7445,8 +7447,9 @@ node\_assign\_gen(struct parser\_params \*pa  
}

-static int  
+static NODE \*  
value\_expr\_gen(struct parser\_params \*parser, NODE \*node)  
{  
int cond = 0;

- NODE \*node0 = node;

- 

```
 return Qfalse;

```

- 

```
 return 0;

```

case NODE\_RETURN:  
@@ -7467,5 +7470,5 @@ value\_expr\_gen(struct parser\_params _par  
if (!cond) yyerror(“void value expression”);  
/_ or “control never reach”? \*/

- 

```
 return Qfalse;

```

- 

```
 return 0;

```

case NODE\_BLOCK:  
@@ -7481,5 +7484,5 @@ value\_expr\_gen(struct parser\_params \*par

case NODE\_IF:

- 

```
 if (!value_expr(node->nd_body)) return Qfalse;

```

- 

```
 if (!value_expr(node->nd_body)) return 0;
 node = node->nd_else;
 break;

```

@@ -7492,9 +7495,9 @@ value\_expr\_gen(struct parser\_params \*par

```
 default:

```

- 

```
 return Qtrue;

```

- 

```
 return node0;

```

}  
}

- return Qtrue;

- return node0;  
}

@@ -7739,5 +7742,5 @@ range\_op(struct parser\_params \*parser, N  
if (type == NODE\_LIT && FIXNUM\_P(node-\>nd\_lit)) {  
warn\_unless\_e\_option(node, “integer literal in conditional range”);

- return call\_op(node,tEQ,1,NEW\_GVAR(rb\_intern("$.")));

- return NEW\_CALL(node, tEQ, NEW\_LIST(NEW\_GVAR(rb\_intern("$."))));  
}  
return node;  
@@ -7826,5 +7829,4 @@ cond\_gen(struct parser\_params \*parser, N  
{  
if (node == 0) return 0;

- value\_expr(node);  
return cond0(parser, node);  
}  
@@ -7901,4 +7903,10 @@ new\_yield\_gen(struct parser\_params \*pars  
}

+static NODE \*  
+new\_not\_gen(struct parser\_params \*parser, NODE \*node)  
+{

- return NEW\_NOT(cond\_value(node));  
+}
- 

static NODE\*  
negate\_lit(NODE \*node)
