summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parse.y12
-rw-r--r--test/ruby/test_syntax.rb24
2 files changed, 36 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index 7efc7a7ea5..63b6ab9b16 100644
--- a/parse.y
+++ b/parse.y
@@ -13864,6 +13864,18 @@ value_expr_check(struct parser_params *p, NODE *node)
case NODE_RETRY:
goto found;
+ case NODE_CASE:
+ case NODE_CASE2:
+ for (node = RNODE_CASE(node)->nd_body;
+ node && nd_type_p(node, NODE_WHEN);
+ node = RNODE_WHEN(node)->nd_next) {
+ if (!(vn = value_expr_check(p, RNODE_WHEN(node)->nd_body))) {
+ return NULL;
+ }
+ if (!void_node) void_node = vn;
+ }
+ break;
+
case NODE_CASE3:
if (!RNODE_CASE3(node)->nd_body || !nd_type_p(RNODE_CASE3(node)->nd_body, NODE_IN)) {
compile_error(p, "unexpected node");
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index 9a14375056..3638d83e2b 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -2053,6 +2053,30 @@ eom
};
end
+ def test_value_expr_in_case
+ assert_syntax_error("#{<<~"{#"}\n#{<<~'};'}", /void value expression/, nil, "#{BUG_21669} 1.3")
+ {#
+ x =
+ case a
+ when 1; return
+ when 2; return
+ else return
+ end
+ };
+ end
+
+ def test_value_expr_in_case2
+ assert_syntax_error("#{<<~"{#"}\n#{<<~'};'}", /void value expression/, nil, "#{BUG_21669} 1.3")
+ {#
+ x =
+ case
+ when 1; return
+ when 2; return
+ else return
+ end
+ };
+ end
+
def test_tautological_condition
assert_valid_syntax("def f() return if false and invalid; nil end")
assert_valid_syntax("def f() return unless true or invalid; nil end")