From 8a3e7f08b85a9a21077c420b6fa76f56899e90ee Mon Sep 17 00:00:00 2001 From: Matt Valentine-House Date: Wed, 17 Jan 2024 16:44:58 +0000 Subject: [PATCH] [PRISM] Fix case splat with no predicate --- prism_compile.c | 5 +++-- test/ruby/test_compile_prism.rb | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index 43ac0af160..2d1dd99388 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -3514,10 +3514,11 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, pm_node_t *condition_node = when_node->conditions.nodes[i]; if (PM_NODE_TYPE_P(condition_node, PM_SPLAT_NODE)) { + int checkmatch_type = has_predicate ? VM_CHECKMATCH_TYPE_CASE : VM_CHECKMATCH_TYPE_WHEN; ADD_INSN (ret, &dummy_line_node, dup); PM_COMPILE_NOT_POPPED(condition_node); - ADD_INSN1(ret, &dummy_line_node, splatarray, Qfalse); - ADD_INSN1(ret, &dummy_line_node, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_CASE | VM_CHECKMATCH_ARRAY)); + ADD_INSN1(ret, &dummy_line_node, checkmatch, + INT2FIX(checkmatch_type | VM_CHECKMATCH_ARRAY)); } else { PM_COMPILE_NOT_POPPED(condition_node); diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index f1274fccf5..0765a946a5 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -857,6 +857,17 @@ module Prism end RUBY + # Test splat in when + assert_prism_eval(<<~RUBY) + ary = [1, 2] + case 1 + when :foo, *ary + :ok + else + :ng + end + RUBY + # Test case without predicate assert_prism_eval(<<~RUBY) case @@ -866,6 +877,16 @@ module Prism :ok end RUBY + + # test splat with no predicate + assert_prism_eval(<<~RUBY) + case + when *[true] + :ok + else + :ng + end + RUBY end def test_ElseNode