[ruby-dev:31294] Re: a = -(1) : warning: empty expression
From:
Nobuyoshi Nakada <nobu@...>
Date:
2007-07-24 05:40:38 UTC
List:
ruby-dev #31294
なかだです。
At Tue, 24 Jul 2007 11:22:33 +0900,
Tanaka Akira wrote in [ruby-dev:31293]:
> 以下のように、-(1) で warning: empty expression となります。
ripperをマージしたときのミスのようです。
ついでなのでvalue_expr()関連をちょっと見直してみましたが、
a|=break や while break; end などで何回も void value expression
と繰り返されるのはあまり嬉しくなさそうです。
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)
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦