summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNARUSE, Yui <naruse@airemix.jp>2021-02-02 17:50:00 +0900
committerNARUSE, Yui <naruse@airemix.jp>2021-02-02 17:50:00 +0900
commit2dc39e2fd45aacd5fcd33ed80f602bd6f2ddb504 (patch)
tree819703902b7affaa27f88f05fea657ce6d5cc50c
parentfb6cb226a03c2eeaf4fe68b282fcd6e4a8696ffd (diff)
merge revision(s) 1b89b99941548fdb65305dd9a412082e7fdba45a: [Backport #17534]
Mark pattern labels as unremoveable Peephole optimization doesn't play well with find pattern at least. The only case when a pattern matching could have unreachable patterns is when we have lasgn/dasgn node, which shouldn't happen in real-life. Fixes https://bugs.ruby-lang.org/issues/17534 --- compile.c | 2 +- test/ruby/test_pattern_matching.rb | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-)
-rw-r--r--compile.c2
-rw-r--r--test/ruby/test_pattern_matching.rb10
-rw-r--r--version.h2
3 files changed, 12 insertions, 2 deletions
diff --git a/compile.c b/compile.c
index c62deafd23..a5e082f46d 100644
--- a/compile.c
+++ b/compile.c
@@ -6400,11 +6400,11 @@ compile_case3(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const orig_no
int pat_line = nd_line(pattern);
LABEL *next_pat = NEW_LABEL(pat_line);
ADD_INSN (cond_seq, pat_line, dup);
-
// NOTE: set deconstructed_pos to the current cached value location
// (it's "under" the matchee value, so it's position is 2)
CHECK(iseq_compile_pattern_each(iseq, cond_seq, pattern, l1, next_pat, FALSE, 2));
ADD_LABEL(cond_seq, next_pat);
+ LABEL_UNREMOVABLE(next_pat);
}
else {
COMPILE_ERROR(ERROR_ARGS "unexpected node");
diff --git a/test/ruby/test_pattern_matching.rb b/test/ruby/test_pattern_matching.rb
index 243a4cd2bd..e4c7507ac4 100644
--- a/test/ruby/test_pattern_matching.rb
+++ b/test/ruby/test_pattern_matching.rb
@@ -791,6 +791,16 @@ END
true
end
end
+
+ # https://bugs.ruby-lang.org/issues/17534
+ assert_block do
+ case [0, 1, 2]
+ in x
+ true
+ in [*, 2, *]
+ false
+ end
+ end
end
def test_hash_pattern
diff --git a/version.h b/version.h
index 9a20707c89..c3e1f0f1b2 100644
--- a/version.h
+++ b/version.h
@@ -12,7 +12,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 28
+#define RUBY_PATCHLEVEL 29
#define RUBY_RELEASE_YEAR 2021
#define RUBY_RELEASE_MONTH 2