aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-06-23 11:56:48 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-06-23 11:56:48 +0000
commit5e648b8efe0e835d611973505a087a104425b2d4 (patch)
treeb2de6089808cea65aa1d68edbc0632d4d775e527
parent51e231471b1fa6ac3f3a808d8c389bf614f47b68 (diff)
downloadruby-5e648b8efe0e835d611973505a087a104425b2d4.tar.gz
parse.y: should not warn op method call
* parse.y (void_expr_gen): should warn operator expression style calls only, but not method style calls. [Fix GH-1660] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59162 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--compile.c6
-rw-r--r--node.c1
-rw-r--r--node.h3
-rw-r--r--parse.y6
-rw-r--r--test/ruby/test_parse.rb1
5 files changed, 12 insertions, 5 deletions
diff --git a/compile.c b/compile.c
index f565581c39..7b45d5b246 100644
--- a/compile.c
+++ b/compile.c
@@ -3644,11 +3644,12 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
/* method dispatch */
case NODE_CALL:
+ case NODE_OPCALL:
case NODE_VCALL:
case NODE_FCALL:
case NODE_ATTRASGN:{
const int explicit_receiver =
- (type == NODE_CALL ||
+ (type == NODE_CALL || type == NODE_OPCALL ||
(type == NODE_ATTRASGN && !private_recv_p(node)));
if (!lfinish[1] && (node->nd_args || explicit_receiver)) {
@@ -5237,6 +5238,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popp
break;
}
case NODE_CALL:
+ case NODE_OPCALL:
/* optimization shortcut
* "literal".freeze -> opt_str_freeze("literal")
*/
@@ -5363,7 +5365,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popp
}
#endif
/* receiver */
- if (type == NODE_CALL || type == NODE_QCALL) {
+ if (type == NODE_CALL || type == NODE_OPCALL || type == NODE_QCALL) {
CHECK(COMPILE(recv, "recv", node->nd_recv));
if (type == NODE_QCALL) {
lskip = NEW_LABEL(line);
diff --git a/node.c b/node.c
index b06e6dc175..f6d551a106 100644
--- a/node.c
+++ b/node.c
@@ -475,6 +475,7 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node)
break;
case NODE_CALL:
+ case NODE_OPCALL:
ANN("method invocation");
ANN("format: [nd_recv].[nd_mid]([nd_args])");
ANN("example: obj.foo(1)");
diff --git a/node.h b/node.h
index 8fbe226a87..5590369e2e 100644
--- a/node.h
+++ b/node.h
@@ -92,6 +92,8 @@ enum node_type {
#define NODE_OP_CDECL NODE_OP_CDECL
NODE_CALL,
#define NODE_CALL NODE_CALL
+ NODE_OPCALL,
+#define NODE_OPCALL NODE_OPCALL
NODE_FCALL,
#define NODE_FCALL NODE_FCALL
NODE_VCALL,
@@ -418,6 +420,7 @@ typedef struct RNode {
#define NEW_DSYM(s) NEW_NODE(NODE_DSYM,s,0,0)
#define NEW_EVSTR(n) NEW_NODE(NODE_EVSTR,0,(n),0)
#define NEW_CALL(r,m,a) NEW_NODE(NODE_CALL,r,m,a)
+#define NEW_OPCALL(r,m,a) NEW_NODE(NODE_OPCALL,r,m,a)
#define NEW_FCALL(m,a) NEW_NODE(NODE_FCALL,0,m,a)
#define NEW_VCALL(m) NEW_NODE(NODE_VCALL,0,m,0)
#define NEW_SUPER(a) NEW_NODE(NODE_SUPER,0,0,a)
diff --git a/parse.y b/parse.y
index bfea0c76a7..d8494dc75d 100644
--- a/parse.y
+++ b/parse.y
@@ -8837,14 +8837,14 @@ call_bin_op_gen(struct parser_params *parser, NODE *recv, ID id, NODE *arg1)
{
value_expr(recv);
value_expr(arg1);
- return NEW_CALL(recv, id, NEW_LIST(arg1));
+ return NEW_OPCALL(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);
+ return NEW_OPCALL(recv, id, 0);
}
static NODE*
@@ -9523,7 +9523,7 @@ void_expr_gen(struct parser_params *parser, NODE *node)
if (!node) return;
switch (nd_type(node)) {
- case NODE_CALL:
+ case NODE_OPCALL:
switch (node->nd_mid) {
case '+':
case '-':
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index 4ae2fa273f..030442f9e9 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -761,6 +761,7 @@ x = __ENCODING__
x = x = 1
assert_nil eval("x; nil")
assert_nil eval("1+1; nil")
+ assert_nil eval("1.+(1); nil")
assert_nil eval("TestParse; nil")
assert_nil eval("::TestParse; nil")
assert_nil eval("x..x; nil")