A = -(1) : warning: empty expression

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

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;

    if (!node) {
    @@ -7458,5 +7461,5 @@ value_expr_gen(struct parser_params *par
    case NODE_DEFS:
    parser_warning(node, “void value expression”);

  •  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)