
Issue #19759 has been reported by alanwu (Alan Wu). ---------------------------------------- Bug #19759: Surprising automatic splat with ruby2_keywords_hash https://bugs.ruby-lang.org/issues/19759 * Author: alanwu (Alan Wu) * Status: Open * Priority: Normal * ruby -v: ruby 3.2.2 (2023-03-30 revision e51014f9c0) [arm64-darwin22] * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- On Ruby 3 and newer the following prints `[:aa, :bb, :k]`: ```ruby def yielder(splat) yield([:a, :b], *splat) end yielder([[:aa, :bb], Hash.ruby2_keywords_hash({k: :k})]) do |a, b, k:| p [a, b, k] end ``` It expanded the second array involved and `[:a, :b]` vanished. This is surprising because automatic array expansion for blocks used to only happen when passing one array in total. The script prints `[[:a, :b], [:aa, :bb], :k]` with 2.7.3. --- I found this while puzzling over this line in the autosplat logic: ```c if (given_argc == (NIL_P(keyword_hash) ? 1 : 2) && ``` It might be tempting to fix it by reversing part of commit:beae6cbf0fd and make it `if (given_argc == 1)`. However that's incorrect due to inducing a behavior change for cases like `yield(*[[:a, :b], keywords_hash])`. -- https://bugs.ruby-lang.org/