[ruby-core:120253] [Ruby master Bug#20956] Nested alternation pattern matching bug in 3.4.0-rc1

Issue #20956 has been reported by nevans (Nicholas Evans). ---------------------------------------- Bug #20956: Nested alternation pattern matching bug in 3.4.0-rc1 https://bugs.ruby-lang.org/issues/20956 * Author: nevans (Nicholas Evans) * Status: Open * ruby -v: 3.4.0-rc1 * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- I think I've found a pattern matching bug in ruby 3.4.0-rc1. ```ruby [123, ["foo"]] in [_, /\Afoo\b/i | [/\Afoo\z/i, *]] ``` I also tested this in ruby 2.7.8, with: ```ruby case [123, ["foo"]]; in [_, /\Afoo\b/i | [/\Afoo\z/i, *]] then true; else false end ``` These return `true` in ruby 2.7.8, 3.0.7, 3.1.6, 3.2.6, and 3.3.6. But they return false in 3.4.0-rc1. I'm not sure if this is the best example, but it is a simplification of how I came across the bug. Here are some other similar cases, which give the same result in 3.4.0-rc1 and 3.3.6: ```irb irb(main):001> ["foo"] in /\Afoo\b/i | [/\Afoo\z/i, *] => true irb(main):002> [123, ["foo"]] in [_, [/\Afoo\z/i, *]] => true irb(main):003> [["foo"]] in [[/\Afoo\z/i, *]] => true ``` But this case exhibits the bug again: ```irb irb(main):004> [["foo"]] in [/\Afoo\b/i | [/\Afoo\z/i, *]] => false ``` -- https://bugs.ruby-lang.org/

Issue #20956 has been updated by nevans (Nicholas Evans). This would appear to be a bug in prism, or prism-adjacent code? ```console $ ruby -e 'pp ([["foo"]] in [/\Afoo\b/i | [/\Afoo\z/i, *]])' false $ ruby --parser=parse.y -e 'pp ([["foo"]] in [/\Afoo\b/i | [/\Afoo\z/i, *]])' true ``` ---------------------------------------- Bug #20956: Nested alternation pattern matching bug in 3.4.0-rc1 https://bugs.ruby-lang.org/issues/20956#change-111020 * Author: nevans (Nicholas Evans) * Status: Open * ruby -v: 3.4.0-rc1 * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- I think I've found a pattern matching bug in ruby 3.4.0-rc1. ```ruby [123, ["foo"]] in [_, /\Afoo\b/i | [/\Afoo\z/i, *]] ``` I also tested this in ruby 2.7.8, with: ```ruby case [123, ["foo"]]; in [_, /\Afoo\b/i | [/\Afoo\z/i, *]] then true; else false end ``` These return `true` in ruby 2.7.8, 3.0.7, 3.1.6, 3.2.6, and 3.3.6. But they return false in 3.4.0-rc1. I'm not sure if this is the best example, but it is a simplification of how I came across the bug. Here are some other similar cases, which give the same result in 3.4.0-rc1 and 3.3.6: ```irb irb(main):001> ["foo"] in /\Afoo\b/i | [/\Afoo\z/i, *] => true irb(main):002> [123, ["foo"]] in [_, [/\Afoo\z/i, *]] => true irb(main):003> [["foo"]] in [[/\Afoo\z/i, *]] => true ``` But this case exhibits the bug again: ```irb irb(main):004> [["foo"]] in [/\Afoo\b/i | [/\Afoo\z/i, *]] => false ``` -- https://bugs.ruby-lang.org/

Issue #20956 has been updated by alanwu (Alan Wu). Assignee set to prism ---------------------------------------- Bug #20956: Nested alternation pattern matching bug in 3.4.0-rc1 https://bugs.ruby-lang.org/issues/20956#change-111031 * Author: nevans (Nicholas Evans) * Status: Open * Assignee: prism * ruby -v: 3.4.0-rc1 * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- I think I've found a pattern matching bug in ruby 3.4.0-rc1. ```ruby [123, ["foo"]] in [_, /\Afoo\b/i | [/\Afoo\z/i, *]] ``` I also tested this in ruby 2.7.8, with: ```ruby case [123, ["foo"]]; in [_, /\Afoo\b/i | [/\Afoo\z/i, *]] then true; else false end ``` These return `true` in ruby 2.7.8, 3.0.7, 3.1.6, 3.2.6, and 3.3.6. But they return false in 3.4.0-rc1. I'm not sure if this is the best example, but it is a simplification of how I came across the bug. Here are some other similar cases, which give the same result in 3.4.0-rc1 and 3.3.6: ```irb irb(main):001> ["foo"] in /\Afoo\b/i | [/\Afoo\z/i, *] => true irb(main):002> [123, ["foo"]] in [_, [/\Afoo\z/i, *]] => true irb(main):003> [["foo"]] in [[/\Afoo\z/i, *]] => true ``` But this case exhibits the bug again: ```irb irb(main):004> [["foo"]] in [/\Afoo\b/i | [/\Afoo\z/i, *]] => false ``` -- https://bugs.ruby-lang.org/

Issue #20956 has been updated by eightbitraptor (Matt V-H). This does appear to be an issue in `prism_compile.c` Golfed down to ```ruby 1 in [1 | [1]] ``` The instructions generated by Prism and parse.y are pretty significantly different, and appears to be related to nesting an `Alternative Pattern` inside an `Array Pattern` generated instructions and diff output [is in this gist](https://gist.github.com/eightbitraptor/b405199234393e1466c19ccb46a53877) ---------------------------------------- Bug #20956: Nested alternation pattern matching bug in 3.4.0-rc1 https://bugs.ruby-lang.org/issues/20956#change-111038 * Author: nevans (Nicholas Evans) * Status: Open * Assignee: prism * ruby -v: 3.4.0-rc1 * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- I think I've found a pattern matching bug in ruby 3.4.0-rc1. ```ruby [123, ["foo"]] in [_, /\Afoo\b/i | [/\Afoo\z/i, *]] ``` I also tested this in ruby 2.7.8, with: ```ruby case [123, ["foo"]]; in [_, /\Afoo\b/i | [/\Afoo\z/i, *]] then true; else false end ``` These return `true` in ruby 2.7.8, 3.0.7, 3.1.6, 3.2.6, and 3.3.6. But they return false in 3.4.0-rc1. I'm not sure if this is the best example, but it is a simplification of how I came across the bug. Here are some other similar cases, which give the same result in 3.4.0-rc1 and 3.3.6: ```irb irb(main):001> ["foo"] in /\Afoo\b/i | [/\Afoo\z/i, *] => true irb(main):002> [123, ["foo"]] in [_, [/\Afoo\z/i, *]] => true irb(main):003> [["foo"]] in [[/\Afoo\z/i, *]] => true ``` But this case exhibits the bug again: ```irb irb(main):004> [["foo"]] in [/\Afoo\b/i | [/\Afoo\z/i, *]] => false ``` -- https://bugs.ruby-lang.org/
participants (3)
-
alanwu (Alan Wu)
-
eightbitraptor (Matt V-H)
-
nevans (Nicholas Evans)