summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-11-30 00:15:29 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-11-30 00:15:29 +0900
commitd1ef4fd08e60adcbcb4feeb55f767ff3d80b65a0 (patch)
tree99744a28497edc5c632b01d840b7fc4fa47576f5
parent36da0b3da1aed77e0dffb3f54038f01ff574972b (diff)
Make single line pattern matching void expression
Instead of returning `nil`, raise a syntax error if its value is used. [Feature #16355]
-rw-r--r--parse.y11
-rw-r--r--test/ruby/test_pattern_matching.rb4
2 files changed, 13 insertions, 2 deletions
diff --git a/parse.y b/parse.y
index c1df3060bd..15c9b419d7 100644
--- a/parse.y
+++ b/parse.y
@@ -10740,6 +10740,17 @@ value_expr_check(struct parser_params *p, NODE *node)
case NODE_RETRY:
return void_node ? void_node : node;
+ case NODE_CASE3:
+ if (!node->nd_body || nd_type(node->nd_body) != NODE_IN) {
+ compile_error(p, "unexpected node");
+ return NULL;
+ }
+ if (node->nd_body->nd_body) {
+ return NULL;
+ }
+ /* single line pattern matching */
+ return void_node ? void_node : node;
+
case NODE_BLOCK:
while (node->nd_next) {
node = node->nd_next;
diff --git a/test/ruby/test_pattern_matching.rb b/test/ruby/test_pattern_matching.rb
index 50bab51bfa..5308ec3281 100644
--- a/test/ruby/test_pattern_matching.rb
+++ b/test/ruby/test_pattern_matching.rb
@@ -1261,12 +1261,12 @@ END
################################################################
def test_modifier_in
- assert_nil (1 in a)
+ 1 in a
assert_equal 1, a
assert_raise(NoMatchingPatternError) do
{a: 1} in {a: 0}
end
- assert_valid_syntax "p(({} in {a:}), a:\n 1)"
+ assert_syntax_error("if {} in {a:}; end", /void value expression/)
assert_syntax_error(%q{
1 in a, b
}, /unexpected/, '[ruby-core:95098]')